我的.htaccess配置有一个奇怪的情况。 我有一个多域托管,每个域有一个目录。 例如,我有:
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/
(最后用斜线) 内容显示属性,地址栏上的URL保持不变,但是 如果我这样做:
http://www.domain2.com/subdirectory
(最后没有斜线) 内容显示正确,但地址栏上的网址更改为:
http://www.domain2.com/domain2/subdirectory/
(注意子目录名称和末尾附加斜杠) 我不喜欢用户看到地址栏上的更改,这是我的问题
答案 0 :(得分:1)
这是mod_dir
和DirectorySlash
干扰URI文件映射管道。默认情况下,DirectorySlash
处于启用状态,这样当apache认为请求是针对某个目录时,并且它缺少尾部斜杠时,它会使用尾部斜杠重定向到URI 。这样做是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]