2012-09-24 37 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

相关问题