使用mod_rewrite,RewriteRule无法正常工作

时间:2013-04-28 17:21:06

标签: regex apache mod-rewrite

我正在制作一个网站,目前只使用xampp从localhost运行。我正在使用mod-rewrite将所有内容重定向到我的索引,到目前为止一直有效。

# From  /somepage
# To    ?site=somepage
RewriteRule ^([^/\.\?=]+)/?$ ?site=$1 [L]

# From  /somepage=ID
# To    ?site=somepage&sub=ID
RewriteRule ^([^/\.\?=]+)=([^/\.\?]+)/?$ ?site=$1&sub=$2 [L]

但我还希望能够在URL的末尾添加更多查询字符串变量,这样您就可以发送或标记该链接,而重定向仍然有效。我做了这样的事情:

# From  /somepage?morevars
# To    ?site=somepage&morevars
RewriteRule ^([^/\.\?=]+)\?(.+) ?site=$1&$2 [L]

我为此尝试了不同的变体,还包括条件或将其与其他规则合并,但没有成功。它似乎与第一条规则相匹配,但我不确定。

2 个答案:

答案 0 :(得分:2)

给予RewriteRule的模式与请求URL路径匹配。也就是说,请求URL 没有方案,主机,端口和查询字符串

您需要将[QSA](查询字符串追加)标记添加到第一个规则。请参阅RewriteRule的参考文档。

答案 1 :(得分:2)

.htaccess按顺序处理,因此如果Apache找到匹配并且您正在使用[L]标志,则它会停止,因为这是Last命令。不应该需要?匹配,因为RewriteRule会将它们视为查询字符串并忽略它们。

  

注意: Query String

     

模式不会与查询字符串匹配。相反,你   必须使用带有%{QUERY_STRING}变量的RewriteCond。您可以,   但是,在替换字符串中创建包含查询的URL   字符串部分。只需在替换中使用问号   string,表示应重新注入以下文本   查询字符串。如果要删除现有查询字符串,请结束   替换字符串只有一个问号。结合一个新的   使用旧的查询字符串,使用[QSA]标志。

这应该有用。

RewriteRule ^([^/\.=]+)=([^/\.]+)/?$ ?site=$1&sub=$2 [L]
RewriteRule ^([^/\.=]+)/?$ ?site=$1 [QSA,L]