htaccess 重写的行为不同于 iis 重写
htaccess rewrite behaves differently than iis rewrite
这些是我的 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 (.*)(/|\)$ [R]
# everything
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)$ /core/handler.php?url= [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)$ /core/handler.php?url=&%{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
知道哪里出了问题吗?
Apache 不喜欢不以尾部斜杠结尾的目录。原因是因为即使您有索引文件,它也会公开目录内容。所以默认情况下,mod_dir 将始终重定向对没有尾部斜杠的目录的请求。为了解决这个问题,您可以关闭此重定向,但请注意,关闭它后,存在暴露目录内容的危险。
此外,您的最后两个规则可以通过使用 QSA
标志合并为一个:
DirectorySlash Off
# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*)/$ / [L,R]
# everything
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)$ /core/handler.php?url= [L,QSA]
这些是我的 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 (.*)(/|\)$ [R]
# everything
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)$ /core/handler.php?url= [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)$ /core/handler.php?url=&%{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
知道哪里出了问题吗?
Apache 不喜欢不以尾部斜杠结尾的目录。原因是因为即使您有索引文件,它也会公开目录内容。所以默认情况下,mod_dir 将始终重定向对没有尾部斜杠的目录的请求。为了解决这个问题,您可以关闭此重定向,但请注意,关闭它后,存在暴露目录内容的危险。
此外,您的最后两个规则可以通过使用 QSA
标志合并为一个:
DirectorySlash Off
# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*)/$ / [L,R]
# everything
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?)$ /core/handler.php?url= [L,QSA]