.htaccess当没有结束斜杠时,RewriteRule会使地址栏URL更改

时间:2012-09-24 03:40:50

标签: apache .htaccess mod-rewrite redirect

我的.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/

(注意子目录名称和末尾附加斜杠) 我不喜欢用户看到地址栏上的更改,这是我的问题

1 个答案:

答案 0 :(得分:1)

这是mod_dirDirectorySlash干扰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]