htaccess重写的行为与iis重写的行为不同

时间:2015-01-18 02:06:34

标签: .htaccess iis url-rewriting

这些是我的web.config规则:

<rule name="Remove Trailing Slash">
  <match url="(.*)(/|\\)$"/>
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
  </conditions>
  <action type="Redirect" url="{R:1}"/>
</rule>
<rule name="anything" stopProcessing="true">
  <match url="^(.*?)$"/>
  <conditions>
    <add input="{DOCUMENT_ROOT}/{R:1}" matchType="IsFile" negate="true"/>
  </conditions>
  <action type="Rewrite" url="/core/handler.php?url={R:1}"/>
</rule>

这些是我的.htaccess规则:

# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*)(/|\\)$ $1 [R]

# everything
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)$ /core/handler.php?url=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)$ /core/handler.php?url=$1&%{QUERY_STRING} [L]

他们应该行为相同,但他们没有,但我无法弄清楚我做错了什么。我正在使用IIS重写模块进行本地网站测试,但我托管的服务器使用apache,因此.htaccess

这一点是使用愚蠢复杂的php处理程序来完成所有操作通常由服务器完成(我会深入研究原因,但这不是这个问题的重点)。写入规则是为了重写请求的URL,以便服务器为处理器提供服务,处理器提供正确的内容,同时保持相同的面。

总结:

web.config
输入:http://local.com/folder_name
输出:http://local.com/folder_name
内部:http://local.com/core/handler.php?url=folder_name

.htaccess
输入:http://server.com/folder_name
输出:http://server.com/folder_name/?url=folder_name
内部:http://server.com/core/handler.php?url=folder_name

知道出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

Apache并不喜欢不以尾部斜杠结尾的目录。原因是,即使您有索引文件,它也会公开目录内容。因此,默认情况下,mod_dir将始终重定向对不具有尾部斜杠的目录的请求。为了解决这个问题,您可以关闭此重定向,但要注意,关闭它时,存在暴露目录内容的危险。

此外,您可以使用QSA标记将最后两个规则合并为一个:

DirectorySlash Off

# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*)/$ /$1 [L,R]

# everything
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)$ /core/handler.php?url=$1 [L,QSA]