2016-08-26 39 views
1

我有以下的.htaccess,預期其無法正常工作:的.htaccess有多個重寫規則,基於路徑

RewriteEngine On 
RewriteBase/
RewriteCond %{HTTP_HOST} ^example.bg$ 
RewriteRule (.*) http://www.example.bg/$1 [R=301,L] 

RewriteCond %{REQUEST_URI} !^/sessiontest\.php$ 
RewriteCond %{REQUEST_URI} ^/login.* [OR] 
RewriteCond %{REQUEST_URI} ^/admin.*$ 
RewriteRule ^(.*)$ travelpartner.php [L,NC] 

RewriteCond %{REQUEST_URI} !^/sessiontest\.php$ 
RewriteCond %{REQUEST_URI} !^/login.*$ 
RewriteCond %{REQUEST_URI} !^/admin.*$ 
RewriteRule ^(.*)$ perla/$1 [L,NC] 

我需要的是以下幾點:

  1. 如果URI缺少example.bg中的「www」,然後將其添加並重定向到www.example.bg
  2. 如果URI沒有以「sessiontest.php」結尾並以「www.example.bg/login」開頭或以www.example.bg/admin開頭,然後將所有請求轉發給travelpartner.php
  3. 對於所有其他情況下,我們都應該請求轉發到子文件夾,名爲「佩拉」

但是,現在發生的事情是,我們總是看到Perla的子文件夾的內容,即使我打開爲例.bg/login

我在這裏錯過了什麼?

回答

1

根據您目前的規則,我得到了無限重定向循環:

一旦規則第2號匹配,並且請求/login改寫爲/travelpartner.php,重寫的請求被交還給URL解析引擎和規則集從頭再次運行。

這一次,它將匹配的最後一段,並改寫爲/perla/travelpartner.php,並再次發送,並且改寫爲/perla/perla/travelpartner.php,等...

的解決辦法是,在最後一段,防止重寫如果請求與/perla開始或/travelpartner.php

RewriteEngine On 
RewriteBase/
RewriteCond %{HTTP_HOST} ^example.bg$ 
RewriteRule (.*) http://www.example.bg/$1 [R=301,L] 

RewriteCond %{REQUEST_URI} !^/sessiontest\.php$ 
RewriteCond %{REQUEST_URI} ^/login [OR] 
RewriteCond %{REQUEST_URI} ^/admin 
RewriteRule^travelpartner.php [L,NC] 

RewriteCond %{REQUEST_URI} !^/sessiontest\.php$ 
RewriteCond %{REQUEST_URI} !^/login 
RewriteCond %{REQUEST_URI} !^/admin 
RewriteCond %{REQUEST_URI} !^/perla/ 
RewriteCond %{REQUEST_URI} !^/travelpartner\.php$ 
RewriteRule ^(.*)$ perla/$1 [L,NC] 
+0

謝謝您!這是非常豐富和有益的。學到了一兩件事:D – DreamWave

2

您可以使用下面的規則

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^example.bg$ 
RewriteRule^http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R] 
RewriteRule ^(login|admin) /travelpartner.php [L] 
RewriteRule !(perla/|travelpartner\.php) /perla [L]