【问题标题】:Strange Rewriting (Apache mod_rewrite)奇怪的重写(Apache mod_rewrite)
【发布时间】:2026-01-05 15:15:03
【问题描述】:

我对重写规则的结果感到非常困惑。我使用 WAMP 在本地计算机上托管。

RewriteEngine on
RewriteBase   /niklasrosenstein/

RewriteCond   %{REQUEST_URI}    !res/(.+)$
RewriteCond   %{REQUEST_URI}    !index.php$
RewriteRule   ^(.*)$            index.php?uri=$1 [QSA]

http://localhost/niklasrosenstein/res

扩展到

http://localhost/niklasrosenstein/res/?uri=res

浏览器的地址栏中。我在 Firefox 14、Opera 11.62 和 Internet Explorer 8 下测试过。

在 URL 的末尾添加一个斜杠,即

http://localhost/niklasrosenstein/res/

没问题。

有谁知道为什么在浏览器的地址栏中调整 URL?我想使用 mod_rewrite 来摆脱模糊的 URL 格式,但这个问题实际上打破了它..

【问题讨论】:

    标签: php windows apache mod-rewrite wamp


    【解决方案1】:

    有谁知道为什么在浏览器的地址栏中调整 URL?

    这看起来像是 mod_dir/mod_rewrite 冲突。默认情况下,mod_dir 被加载,目录模块的默认值是:

    DirectoryIndex index.html
    DirectorySlash On
    

    第二个默认设置使得每当请求似乎访问目录并且缺少尾部斜杠时,301 重定向到与斜杠相同的 URI。这发生在 URI 文件映射管道中的某处,并干扰了 mod_rewrite 通过您的规则应用的内部重写

    由于您通过index.php 路由所有内容,它可能不是detrimental to turn off DirectorySlash,因此在/niklasrosenstein/ 目录下的htaccess 文件中,尝试将其关闭:

    DirectorySlash Off
    

    否则,您可以尝试使用 mod_rewrite 处理:

    RewriteCond %{REQUEST_FILENAME} -d
    RewriteCond !.+[^/]$
    RewriteRule ^(.+)$ $1/ [L]
    

    【讨论】: