mod_rewrite奇怪的问题

时间:2009-01-27 08:52:49

标签: apache mod-rewrite

我对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]

相应的网址可能如下所示:

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

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

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

3 个答案:

答案 0 :(得分:2)

查询字符串不是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]

答案 1 :(得分:0)

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)
啊,就像Gumbo说的那样;您还可以使用%1来引用页面数字。

答案 2 :(得分:-1)

这只是我还是你的论点?

你的意思是:

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