Mod rewrite mod_rewrite如果你到处使用一个表达式,你能把它放在一个";变量";?

Mod rewrite mod_rewrite如果你到处使用一个表达式,你能把它放在一个";变量";?,mod-rewrite,Mod Rewrite,如果我在htaccess文件中使用以下内容50次: 重写规则^(bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds)/?$/section_index.php?sectionurl=$1[L] 那么,是否可以将bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds放在变量中而不是在每一行中再次使用它?如果是这样,我该怎么做?您可以

如果我在htaccess文件中使用以下内容50次:

重写规则^(bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds)/?$/section_index.php?sectionurl=$1[L]


那么,是否可以将bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds放在变量中而不是在每一行中再次使用它?如果是这样,我该怎么做?

您可以设置一个环境变量:

RewriteRule ^(bla|blo|bli|blu|bloi|bkdo|doid|boidi|woekj|dfpo8ds)/?$ /section_index.php?sectionurl=$1 [L,E=FOOBAR:$1]
现在可以通过
%{ENV:FOOBAR}
访问该值


编辑另一种方法是分步处理请求并链接规则:

# first path segment
RewriteRule ^(bla|blo|bli|blu|bloi|bkdo|doid|boidi|woekj|dfpo8ds)/?([^/].*)?$ $2?sectionurl=$1 [QSA,C]
# second path segment
RewriteRule ^(blog|foo)/?([^/].*)?$ $2?arg1=$1 [QSA,C]
# third path segment
RewriteRule ^(bar|baz)/?([^/].*)?$ $2?arg2=$1 [QSA,C]
# last rule
RewriteRule ^$ section_index.php [L,QSA]
但在使用PHP时,也可以使用PHP解析请求路径,例如:

$_SERVER['REQUEST_URI_PATH'] = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']);
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));
$argNames = array('sectionurl', 'arg1', 'arg2', 'arg3');
foreach ($segments as $i => $segment) {
    if (isset($argNames[$i])) {
        $_GET[$argNames[$i]] = $segment;
    }
}
var_dump($_GET);
现在,您只需使用以下规则将每个请求发送到该PHP文件:

# exclude requests for existing files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

你到底有什么问题?给我们一个你认为变量可以解决问题的例子。问题是我在htaccess文件中多次使用重写规则行。每次我都要再写一次整个bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds作品。所以我想把它放在一个变量中,然后开始这样做:RewriteRule^(mvvariable)/?$/section_index.php?sectionurl=$1[L],但是为什么在多个规则中使用相同的表达式呢?或者这个表达式只是另一个表达式的子表达式(可能是前缀)?同样,举一个这样的规则的例子会很有帮助,它只是一个子表达式。我这样使用:^(MVARIABLE)/?$,下一个规则是^(MVARIABLE)/someotherstuff here?$,下一个规则是^(MVARIABLE)/yetotherstuff?$,等等……作为背景:网站有一大堆url路径,以/bla/或/blo/等开头,然后它们是相同的,像/bla/blogs/和/bloo/blogs/,等等,似乎不起作用,这就是我正在尝试的:RewriteRule^(%{ENV:FOOBAR})/?$/section_index.php?sectionurl=$1[L]您不能在搜索模式中使用变量。但是您可以使用一个额外的
RewriteCond
,比如
RewriteCond%{ENV:FOOBAR}%{REQUEST_URI}^(bla | blo | bli | bloi | bkdo | doid | boidi | woekj | dfpo8ds)/\1
。但这不太优雅。