Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess htaccess中的变量,重写规则问题_.htaccess_Mod Rewrite - Fatal编程技术网

.htaccess htaccess中的变量,重写规则问题

.htaccess htaccess中的变量,重写规则问题,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,如何使用重写规则访问变量 如果我有: 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-t

如何使用重写规则访问变量

如果我有:

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]

(忘记重写规则的第二部分)。。我不想把这个清单放在任何地方(斯柯达、宝马、梅赛德斯)。创建变量比在规则中使用变量更快

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

只能将输入参数中的变量用于
RewriteCond
,并将其作为
RewriteRule
的结果参数。编译正则表达式时会有开销(特别是如果您被迫按照
.htaccess
文件中的每个请求进行编译),因此,如果您允许正则表达式中包含可变内容,则每次比较都必须重新编译正则表达式,以确保准确性,同时牺牲性能。因此,解决办法似乎是不让你这样做


你到底想干什么?

我收到了来自jdMorgan的另一个关于修改的答案:

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]
RewriteCond$1$3^-([0-9]+)-([0-9]+)-有些人认为$[OR]
重写第二个$1$3^some one-/pag-([0-9]+)$[或]
重写第二个$1$3^a-z+-$
重写规则^([^-/]+[\-/])*(斯柯达宝马梅赛德斯)([\-/].+)?$index.php?a=$2[QSA,L]
这里,首先评估RewriteRule模式(请参阅Apache mod_rewrite文档“规则处理”)

如果模式匹配,那么请求的URL路径中“(斯柯达|宝马|梅赛德斯)”前面的任何内容都将放入局部变量“$1”中

“斯柯达|宝马|梅赛德斯”(skoda | bmw | mercedes)后面的内容放入局部变量$3中

请求的URL路径匹配(斯柯达|宝马|梅赛德斯)的值放入$2

然后对每个重写条件进行处理,以检查不带“(斯柯达|宝马|梅赛德斯)”部分的请求URL的格式是否是要接受的格式之一

请注意,“”字符仅用作分隔符,以帮助正确和明确的解析,并且没有此处使用的特殊含义。它们只是“代替”了不希望包含在每行中的变量字符串。您可以使用任何一个或多个字符,如果您确信这些字符在未进行URL编码的情况下不会出现在某个URL中。我喜欢自己使用>或<或~中的任何一个


还请注意,重写规则假定“(斯柯达|宝马|梅赛德斯)”子字符串始终由连字符或斜杠分隔(如果前面或后面有任何其他子字符串)。我指的是包含“[^-/]”(“不是连字符或斜杠”)和“[-/]”(“匹配连字符或斜杠”)的两个子模式。这大大提高了正则表达式模式匹配的效率,因此如果可能,请使用此方法,而不是使用诸如“*”(匹配任何内容、所有内容或任何内容)之类的不明确且低效的子模式.

你不能只接受传入的内容,然后让你的脚本适当地处理不正确的URL?还有,这个列表真的会经常更改吗?不是经常更改,但我在.htacces中有大约100行,而且几乎所有的内容都有重复。嗯,在这种情况下,我能给出的最好建议是有一个tem制作一个
.htaccess
文件,你可以在需要更改变量时查找并替换该文件,然后保存该文件的副本以供使用。这也是一个非常长的
.htaccess
文件;无法压缩一些规则,因此你没有太多的更改?我可以想象更改它是相当烦人的,只是一些事情
mod_rewrite
很遗憾,恐怕无法以任何有用的方式为您修复。