【问题标题】:mod_rewrite weird problemmod_rewrite 奇怪的问题
【发布时间】:2009-01-27 08:52:48
【问题描述】:

我对 mod_rewrite 有一个奇怪的问题,这里相关的规则是:

RewriteRule ^(.*)\/igre\-(.*)\.php\?Page=([0-9]+)$ game.php?GameUrl=$2&Page=$3 [L]
RewriteRule ^(.*)\/igre\-(.*)\.php$ game.php?GameUrl=$2&Page=1 [L]

相应的 URL 可能如下所示:

example.com/miselne-igre/igre-shirk.php?Page=2
example.com/miselne-igre/igre-shirk.php

问题是第一条规则没有效果。如果我使用示例中的第一个 URL,我总是将 1 输入到 Page 变量中,这表明使用了第二个规则。 那么第一个有什么问题呢?如果我说 URL 以“.php”结尾,为什么第二条规则甚至匹配最后带有“.php?Page=XYZ”的 URL?

ps:.htaccess 文件中的其他规则工作正常...

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    查询字符串不是 RewriteRule directive 正在处理的 URI 路径的一部分。您必须使用RewriteCond directive 来处理查询字符串。

    RewriteCond %{QUERY_STRING} ^Page=[0-9]+$
    RewriteRule ^[^/]+/igre-([^/]+)\.php$ game.php?GameUrl=$1&%0 [L]
    RewriteRule ^[^/]+/igre-([^/]+)\.php$ game.php?GameUrl=$1&Page=1 [L]
    

    但您仍然可以通过使用 QSA 标志(查询字符串追加)来简化此操作:

    RewriteRule ^[^/]+/igre-([^/]+)\.php$ game.php?GameUrl=$1 [L,QSA]
    

    【讨论】:

    • 我不知道。我想我从来没有使用过重写查询部分的重写。非常感谢您的超快速解决方案!
    【解决方案2】:

    mod_rewrite 在重写过程中没有使用查询。因此,您首先 RewriteRule 被忽略。您可以将它与RewriteCond(虽然尚未测试)结合起来,如下所示:

    RewriteCond %{QUERY_STRING} Page=([0-9]+)
    RewriteRule ^(.*)\/igre\-(.*)\.php\?Page=([0-9]+)$ game.php?GameUrl=$2 [L, qsappend]
    # qsappend appends the original query, in this case (Page=xx)
    

    啊,就像秋葵所说的那样;您还可以使用%1 来反向引用页码。

    【讨论】:

      【解决方案3】:

      是我自己还是你的论点是前后矛盾的?

      你的意思是:

      RewriteRule ^(.*)\/(.*)\-igre\.php\?Page=([0-9]+)$ game.php?GameUrl=$2&Page=$3 [L]
      RewriteRule ^(.*)\/(.*)\-igre\.php$ game.php?GameUrl=$2&Page=1 [L]
      

      您想匹配 miselne-igre 而不是 igre-miselne

      显然这并没有解决主要问题,但我想我会把它扔进去。

      Dom

      【讨论】:

      • 在给定的示例中,我只对“逃避”部分感兴趣。所以我的重写是可以的:)
      • 一开始我也被这个抓住了,但是他没有抓住路径,但是文件名和它开头的斜杠(“/igre”),斜杠必须被转义,所以它是'\/igre'
      猜你喜欢
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2015-02-27
      • 2018-06-26
      • 2011-08-13
      • 2011-08-17
      • 2011-02-02
      • 2021-10-10
      相关资源
      最近更新 更多