mod_rewrite'添加路径信息后缀:'

时间:2009-01-13 14:54:59

标签: apache mod-rewrite

为什么我的mod_rewrite会这样做?

add path info postfix: /home/mobelluk/public_html/about.php -> /home/mobelluk/public_html/about.php/

会导致一切不必要的尾部斜杠。

我已禁用所有.htaccess规则,因此它们不在等式中。

4 个答案:

答案 0 :(得分:18)

显然在某些情况下mod_rewrite重新附加修复后部分存在问题 https://issues.apache.org/bugzilla/show_bug.cgi?id=38642

  

问题:

     

如果.htaccess文件中的多个RewriteRules匹配,则PATH_INFO的不需要的副本可能会在URI的末尾累积。

如果您使用的是Apache 2.2.12或更高版本,则可以使用DPI标志来防止这种情况发生 http://httpd.apache.org/docs/2.2/rewrite/flags.html

答案 1 :(得分:2)

是否有可能新服务器加载了mod_dir,而旧版服务器没有加载DirectorySlash On,这导致了这个问题?

(请注意,DirectorySlash On是默认情况,如果mod_dir已加载且没有任何内容覆盖它<)

答案 2 :(得分:1)

我通过在虚拟主机选项配置中禁用MultiView来解决了这个问题。我改写了类似下面的内容:

所需的重写:

/dir/ -> /dir.html

实际翻译:

/dir/ -> /dir.html (MultiViews)
/dir.html -> /dir.html/ (mod_rewrite: 404, didn't exist)

禁用MultiView可以保持初始翻译的发生。我本可以调整重写规则来弥补这一点,但我还是没有将MultiView用于其他任何事情。

以下帖子告诉我这个问题: https://velenux.wordpress.com/2012/07/17/apache-mod_rewrite-multiple-add-path-info-postfix/#comment-1476

答案 3 :(得分:1)

在搜索“添加路径信息后缀”时,这个问题首先出现,虽然它最终解决了我的问题,但我花了将近2个小时来了解发生了什么。 在网站上工作时,我需要重写:

/resources/band/ -> resources.html?section=band

使用此mod_rewrite完成:

RewriteRule ^resources/(.*)/$ resources.html?section=$1 [L]

将其更改为[DPI]没有做任何事情......我的resources.html页面上的代码是100%肯定被调用但是 section = band 的参数没有发送给它。

获取此...如果您发现Apache的文档无法阅读,Multiviews就是问题所在。当浏览器看到多视图在服务器上时看到/ resources / band /并说“哦,我很聪明,我知道这意味着什么!”和重定向:

/resources/band/ -> /resources.html/band/

真实故事!我在虚拟主机上将+ Multiviews更改为-Multiviews - 问题立即得到解决。