0

我正在制作一个网站,目前只是使用 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]

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

4

2 回答 2

2

给 RewriteRule 的模式与请求 URL 路径匹配。即没有方案、主机、端口和查询字符串的请求 URL 。

What you need is to add the [QSA] (query string append) flag to your first rule. See the reference documentation for RewriteRule.

于 2013-04-28T17:48:48.880 回答
2

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

注意:查询字符串

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

这应该有效。

RewriteRule ^([^/\.=]+)=([^/\.]+)/?$ ?site=$1&sub=$2 [L]
RewriteRule ^([^/\.=]+)/?$ ?site=$1 [QSA,L]
于 2013-04-28T17:55:17.830 回答