【问题标题】:Will Apache check a RewriteRule on every request if the REQUEST_URI is not explicitly set in a RewriteCond?如果 REQUEST_URI 未在 RewriteCond 中显式设置,Apache 会检查每个请求的 RewriteRule 吗?
【发布时间】:2013-08-23 09:49:34
【问题描述】:

我对 Apache Rewrites 很陌生,所以这可能是一个简单的问题(要找到直接答案并不那么简单)。

所以我有以下重写:

RewriteCond %{QUERY_STRING} ^parm=([a-z]+)$ [NC]
RewriteRule ^path/to/some_script.php /simple-url-$1.html? [R=301,L]

这似乎在测试中按预期运行:

www.mydomain.com/path/to/some/script.php?parm=foo

正确的 301 到:

www.mydomain.com/simple-url-foo.html

但是,我担心的是,如果没有显式定义脚本的 RewriteCond,无论是否针对 some_script.php,都会检查此条件,这会导致 Apache 不必要的负载。

是这样吗?如果是这样,我很难弄清楚在这种情况下如何使用 REQUEST_URI,IE:

RewriteCond %{REQUEST_URI} ^path/to/some_script.php [NC]
RewriteCond %{QUERY_STRING} ^parm=([a-z]+)$ [NC]
RewriteRule ^path/to/some_script.php /simple-url-$1.html? [R=301,L]

上述方法似乎不起作用,我不知道为什么。有什么指点吗?

【问题讨论】:

    标签: apache .htaccess mod-rewrite rewrite


    【解决方案1】:

    简短回答,%{REQUEST_URI} 条件是不必要的。

    通过添加条件,您只是将请求 URI 比较移到查询字符串之前。它仍将与每个请求进行比较。事实上,这让情况变得更糟了,因为some_script.php 的比较会发生两次。在RewriteCond 中一次,在RewriteRule 中再一次。

    而且,使用您的原始设置,并不是每个请求 URI 都在检查 some_script.php%{QUERY_SRING} 还确保仅对带有 parm 查询参数的请求进行比较。

    【讨论】:

    • @anubhava 谢谢老兄。嘿,我有一个小忙要问:) 你能访问这个answer,看看你是否能找到为什么接受的答案有效而我的答案无效。我向 Jon Lin 提问,但他选择不回复。一直困扰着我!谢谢:)
    • 好的老大,我会在分析后几分钟内给出答案。
    • @RaviThapliyal 非常感谢您的指点!考虑到您所说的,有没有办法改进重写以仅在“parm”参数与 some_script.php 配对时评估此规则?如果还有其他具有类似名称参数的脚本/页面?
    • @JR.XYZA,这正是正在发生的事情。 %{QUERY_STRING} 首先检查 parm 是否存在,if yes 然后检查请求的文件是否为 some_script.php。这些是触发规则所需的仅有的两项检查。 不多也不少。
    猜你喜欢
    • 2016-04-27
    • 2011-08-17
    • 2012-02-29
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多