【问题标题】:htaccess rewrite behaves differently than iis rewritehtaccess 重写的行为与 iis 重写不同
【发布时间】:2015-01-18 10:45:28
【问题描述】:

这些是我的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

知道出了什么问题吗?

【问题讨论】:

    标签: .htaccess iis url-rewriting


    【解决方案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]
    

    【讨论】:

    • 如果我禁用了目录浏览,它会暴露目录内容吗?
    • 另外,对于重定向到处理程序页面的所有内容,为什么它能够公开其他任何内容?
    • @Aarilight 如果目录浏览被禁用,您将看不到目录,如果直接访问目录被路由到处理程序,您将看不到目录。这只是需要牢记的事情(例如,如果稍后您更改设置并忘记重新打开 DirectorySlash,或者您将 htaccess 文件迁移到其他地方并更改规则或具有不同的设置)
    • 好的,感谢您提供的信息。 QSA 的事情也很容易知道。
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多