1

我对 .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

(末尾没有斜线)内容正确显示,但地址栏上的 url 更改为:

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

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

4

1 回答 1

1

这会mod_dir干扰DirectorySlashURI 文件映射管道。默认情况下DirectorySlash是打开的,这使得当 apache 认为请求是针对目录的并且它缺少尾部斜杠时,它会 301 重定向到带有尾部斜杠的 URI。这样做是有充分理由的,因为可能存在信息泄露安全问题。如果您不允许目录索引,则可以将其关闭:

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]
于 2012-09-24T05:54:22.723 回答