htaccess中的变量,RewriteRule问题

时间:2010-07-08 11:30:19

标签: .htaccess mod-rewrite

我如何使用RewriteRule访问变量?

如果我有:

SetEnv MY_VAR (a|b|c)

RewriteRule ^%{ENV:MY_VAR}$ index.php?s=$1 [L,QSA]

RewriteRule ^%{ENV:MY_VAR}-some-one$ index.php?s=$1 [L,QSA]

我有这些例子,但不起作用。

稍后修改

好的蒂姆,谢谢你的回答。让我说我有:

RewriteRule ^(skoda|bmw|mercedes)-([0-9]+)-([0-9]+)-some-think$ index.php?a=$1 [L,QSA]

RewriteRule ^some-one-(skoda|bmw|mercedes)/pag-([0-9]+)$ index.php?a=$1 [L,QSA]

RewriteRule ^a-z-(skoda|bmw|mercedes)$ index.php?a=$1 [L,QSA]

(忘记RewriteRule的第二部分)..我不想把这个列表放到任何地方(skoda | bmw | mercedes)。是否更快地制作变量然后在规则中使用它...

2 个答案:

答案 0 :(得分:0)

您不能这样做,因为mod_rewrite不会扩展正则表达式子句中的变量。

您只能在RewriteCond的输入参数中使用变量,并将RewriteRule的结果参数用作参数。编译正则表达式会产生开销(特别是如果你被迫按照.htaccess文件的请求执行它),所以如果你在其中允许变量内容,则必须重新编译它们以进行每次比较。以性能为代价确保准确性。因此,解决方案似乎是不让你这样做。

无论如何,你到底想要做什么?

答案 1 :(得分:0)

我在jdMorgan的mod_rewrite forum上收到了另一个答案:

Mod_rewrite不能在正则表达式模式中使用变量。 .htaccess指令不是脚本语言......

我建议:

RewriteCond $1<>$3 ^<>-([0-9]+)-([0-9]+)-some-think$ [OR]
RewriteCond $1<>$3 ^some-one-<>/pag-([0-9]+)$ [OR]
RewriteCond $1<>$3 ^a-z+-<>$
RewriteRule ^([^\-/]+[\-/])*(skoda|bmw|mercedes)([\-/].+)?$ index.php?a=$2 [QSA,L]

这里首先评估RewriteRule模式(参见Apache mod_rewrite文档“Rule Processing”)。

如果模式匹配,那么请求的URL路径中的“(skoda | bmw | mercedes)”之前的任何内容都将放入本地变量“$ 1”。

随后的任何内容“(skoda |宝马|梅赛德斯)”被放入本地变量$ 3。

请求的URL路径匹配“(skoda | bmw | mercedes)”的值被置于$ 2。

然后处理每个RewriteConds以检查所请求的URL的格式没有“(skoda | bmw | mercedes)”部分是要接受的格式之一。

请注意“&lt;&gt;”字符仅用作分隔符以帮助正确和明确的解析,并且没有这里使用的特殊含义。它们只是“取代”您不希望包含在每一行中的变量字符串。您可以使用您确定永远不会出现在您的某个网址中的任何字符或字符,而无需先进行网址编码。我更喜欢使用任何&gt;或者&lt;或者〜我自己。

另请注意,RewriteRule假定“(skoda | bmw | mercedes)”子字符串将始终由连字符或斜杠分隔,如果任何其他子字符串在其之前或之后。我指的是包含“[^ - /]”(“不是连字符或斜杠”)和“[ - /]”(“匹配连字符或斜杠”)的两个RewriteRule子模式。这极大地提高了正则表达式模式匹配的效率,因此如果可能,请使用此方法,而不是使用模糊且低效的子模式,如“。*”(匹配任何内容,所有内容或任何内容)。