2012-09-24 40 views
1

我有一個奇怪的情況,使用.htaccess配置。 我有一個多域主機,每個域有一個目錄。 例如,我有:.htaccess當沒有結尾斜槓時,RewriteRule會使地址欄url更改

http://www.domain1.com 
http://www.domain2.com 

及以下的目錄結構:

/domain1/ 
/domain1/index.php 
/domain2/ 
/domain2/index.php 
/domain2/subdirectory/ 
/domain2/subdirectory/index.php 

.htaccess文件,內容如下:

RewriteEngine On 

RewriteCond %{HTTP_HOST} ^(www\.)?domain1\.com$ [NC] 
RewriteCond %{REQUEST_URI} !^/domain1/.*$ 
RewriteRule ^(.*)$ domain1/$1 [L] 

RewriteCond %{HTTP_HOST} ^(www\.)?domain2\.com$ [NC] 
RewriteCond %{REQUEST_URI} !^/domain2/.*$ 
RewriteRule ^(.*)$ domain2/$1 [L] 

所有的作品,因爲我有一個喜歡例外: 如果我這樣做:

http://www.domain2.com/subdirectory/ 

(與在最後一個斜槓) 內容propertly顯示和地址欄上的網址保持不變,但 如果我這樣做:

http://www.domain2.com/subdirectory 

(結尾沒有斜槓) 內容正確顯示,但地址欄上的網址變更爲:

http://www.domain2.com/domain2/subdirectory/ 

(注意子目錄名和斜槓結尾處附加) ,我不喜歡的用戶看到這種變化地址這是我的問題

回答

1

這是mod_dirDirectorySlash干擾URI文件映射管道。默認情況下,DirectorySlash已打開,這使apache認爲請求是針對某個目錄並且缺少結尾的斜槓,然後它301重定向到,後跟斜槓。做這個because of a possible information disclosure security concern有一個很好的理由。如果不允許目錄索引,你可以只將其關閉:

DirectorySlash Off 

然後Apache將無法重定向到斜線的。或者您可以將自己重定向爲重寫引擎的一部分。你內部重寫的URL被公開的原因是因爲2個模塊正在修改URI,mod_dir和mod_rewrite,並且他們沒有相互認識就這麼做。因此,URI被mod_rewrite重寫,然後mod_dir出現並說「這是一個目錄!」,通過添加尾部斜槓並將其標記爲重定向響應,更多地改變了URI。最終,你得到的是一個帶有損壞URI的重定向。通過在mod_rewrite中處理重定向,到達mod_dir時,一切都很好。

這將需要您目前的規則

RewriteCond %{HTTP_HOST} ^(www\.)?domain1\.com$ [NC] 
RewriteCond %{REQUEST_URI} !^/domain1/.*$ 
RewriteCond %{DOCUMENT_ROOT}/domain1%{REQUEST_URI} -d 
RewriteRule ^(.*[^/])$ /$1/ [L,R=301] 

RewriteCond %{HTTP_HOST} ^(www\.)?domain2\.com$ [NC] 
RewriteCond %{REQUEST_URI} !^/domain2/.*$ 
RewriteCond %{DOCUMENT_ROOT}/domain2%{REQUEST_URI} -d 
RewriteRule ^(.*[^/])$ /$1/ [L,R=301] 
+0

喬恩嗨以上,非常感謝你,你的解決方案完美地工作。在開始時我認爲它不起作用,但我需要清除瀏覽器緩存,之後一切都很好 – Angel

相關問題