【问题标题】:Apache mod_rewrite is removing slashes and generally ignoring my rulesApache mod_rewrite 正在删除斜杠并且通常忽略我的规则
【发布时间】:2014-07-14 21:41:27
【问题描述】:

我无计可施,Stack Overflowers。尝试做我认为是一个简单的重写规则,用波浪号替换 URL 中的斜杠,然后在末尾添加一个“.html”。 所以我的 .htaccess 是这样的:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.+)/(.+)$ $1~$2 [N]

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

基本上,我正在运行一个重复的规则,每次用波浪线替换所有斜线,然后我的最终规则添加“.html”——因为我们所有的网络文件都需要在一个文件夹中(客户端请求——愚蠢,我知道)。

我在这里测试了“第一部分/第二部分/第三部分”模式:http://martinmelin.se/rewrite-rule-tester/,它只有在我砍掉初始斜线并删除重写条件时才有效(这没有意义 b/ c 我放在那里的文件名不应该存在于该服务器上),但在我的本地服务器上并非如此。

它最终应该读取文件“part-one~part-two~part-three.html”,但是当我查看本地机器上的 Apache 错误日志时,我得到了:

文件不存在:/path/to/website/part-one

所以它基本上切断了最后两部分,从不尝试添加“.html”——那么到底发生了什么?请帮忙,mod_rewrite 大师!!

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案1】:

    它希望您删除前导 / 的原因是因为重写引擎在通过 htaccess 文件中的规则运行前缀(URI 的前导斜杠)之前去除了前缀(URI 的前导斜杠)。如果您使用的是 apache 1.3,或者规则位于服务器或虚拟主机配置中的非每个目录上下文中,那么您需要规则模式中的前导斜杠:

    RewriteEngine on
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)/(.+)$ /$1~$2 [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}.html -f
    RewriteRule ^([^/]+)$ /$1.html [L]
    

    此外,您可能不希望 N 标志,因为您希望 rewrite 在其当前迭代中立即停止。此外,在重写之前首先检查 .html 是否确实存在的条件将防止 500 内部服务器错误。

    【讨论】:

    • 哇,谢谢十亿。我仍然不确定为什么会这样(比如它如何在没有 [N] 的情况下替换两个斜线?),但它完全可以。我终于可以过上我的生活了。
    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多