这些是我的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
知道出了什么问题吗?
答案 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]