apache重写冲突

时间:2010-08-27 08:34:32

标签: apache mod-rewrite

我知道有些事情存在冲突,但作为一个mod重写Muggle是时候寻求帮助了。

我正在重写http://test.com/[name]/
http://test.com/script.php?id=[name]
成功,使用:

(rule#1)
RewriteRule ^(.*)\/$ script.php?id=$1&%{QUERY_STRING} [L]

接下来,我重写http://test.com/[name]/foobar/[key]
http://test.com/script.php?id=[name]&foobar=[key]
也取得了成功,使用:

(rule#2)
RewriteRule ^(.*)\/foobar/([0-9]+)$ script.php?id=$1&foobar=$2 [L]

但是,当我尝试包含查询字符串时,
所以http://test.com/[name]/foobar/[key]?p=[page]
可以重写为http://test.com/script.php?id=[name]&foobar=[key]&p=[page] 有了这个:

(rule#3)
RewriteRule ^(.*)\/foobar/([0-9]+)$ script.php?id=$1&foobar=$2&%{QUERY_STRING} [L]
然后Apache就把我扔回http://test.com/script.php

我从试验中得知,如果规则#3没有像规则#1那样使用相同的script.php,则规则#3会起作用 但是我不知道如何解决它,所以任何帮助都会受到赞赏!

Arrgh ......在用Gumbo的例子仔细检查我的规则后,我终于发现了什么问题。虽然不完美,但我的重写规则实际上是按预期工作的。但是我完全忘记了我有另一个脚本来检查有效参数......显然,抛出随机测试值,有时候不是一个好主意。谢谢^ /技巧!

2 个答案:

答案 0 :(得分:2)

使用[^/]+仅匹配除/之外的一个或多个任意字符,而不是.*任意数量的任意字符:

RewriteRule ^([^/]+)/$ script.php?id=$1&%{QUERY_STRING} [L]
RewriteRule ^([^/]+)/foobar/([0-9]+)$ script.php?id=$1&foobar=$2 [L]

此外,您可以设置 QSA 标志,使原始请求的查询自动附加到新网址,而不是手动附加:

RewriteRule ^([^/]+)/$ script.php?id=$1 [L,QSA]

答案 1 :(得分:0)

警告:您使用的是.*,实际上无法匹配。使用.+,除非您打算不与任何内容匹配。

这里列出了所有规则吗?你的error_log中有关于此的错误吗?