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]