【问题标题】:Apache RewriteRule: bad flag delimitersApache RewriteRule:错误的标志分隔符
【发布时间】:2012-01-03 20:05:53
【问题描述】:

这是我的 .htaccess 文件

# Redirect every request to index.php
RewriteBase /
RewriteEngine on 
RewriteRule .* to public/index.php

我在 error.log 中收到以下错误:

RewriteRule:错误的标志分隔符

.htaccess 文件有什么问题? (我刚开始编写 mod_rewrite 模块)。

编辑:.htaccess 文件位于站点的根目录中。

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    删除“to”:

    RewriteRule .* public/index.php
    

    Documentation

    【讨论】:

    • 还有一件事,当我使用RewriteRule .* public/index.php 时,看起来如果网络服务器被卡住并且我没有收到任何响应,但如果我使用RewriteRule .* test.html,我会正确地重定向到测试.html
    【解决方案2】:

    AFAIK,重写规则中不需要“to”。把那个词删掉就可以了。

    RewriteRule .* public/index.php
    

    docs 对此进行了深入探讨。

    【讨论】:

      【解决方案3】:

      其他的都是对的,但别忘了保留URL中?后面的东西,就是QSA标志,像这样:

      # Redirect every request to index.php
      RewriteBase /
      RewriteEngine on 
      RewriteRule .* public/index.php [QSA]
      

      【讨论】:

      • 抱歉,Olivier 但那不准确。如果您希望将查询字符串参数 追加 到原始请求中的参数,则需要 [QSA](“查询字符串追加”)标志。如果您只想保留原始请求的查询字符串,这是默认行为,您不需要 QSA。 [而且,如果你想完全去掉它,只需输入一个“?”在 RewriteRule 的目标 URL 的末尾。] HTH Chris
      • 从我自己的测试中(查看我关于重写规则的答案的历史),我可以告诉你的是:如果你在查询中添加了一些东西,即在这里:public/index.php?aa=bb 那么你会失去什么在原始请求中。所以你可能是对的,但我在这里谈论的是一个不要忘记的好原则,因为如果你不这样做,你总有一天会遇到麻烦。这就是我说“不要忘记保留后面的内容?”时的意思。 (可能是我表达的不够好,如果是的话,我很抱歉)
      • 所以,是的,这里的所有答案都很好,但没有人提到我可以称之为好的原则。如果您是对的,并且默认行为是保留原始请求的查询字符串 - 只要它没有被修改,这不会增加任何开销。
      • 很公平。在目标没有查询字符串的规则中添加 [QSA] 是无害的,除了会使 conf 文件有点混乱。如果您更喜欢更详细的 conf 并在以后修改规则以向目标添加查询字符串时保护自己免受意外副作用的影响,好吧,没有伤害。我的 apache conf 非常复杂(mod_rewrite + mod_proxy + mod_wurfl + mod_setenvif + mod_headers,都在相同的逻辑上交互)所以我尽量保持精简,而不是防御性的 conf 以应对我可能永远不会实施的未来变化。 YMMV。祝你今天过得愉快! :)
      猜你喜欢
      • 2017-10-04
      • 1970-01-01
      • 2014-01-20
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多