mod_rewrite, если вы используете выражение повсеместно, можете ли вы поместить его в «переменную»? - PullRequest
0 голосов
/ 04 мая 2009

Если я использую следующее как 50 раз в моем файле htaccess:

RewriteRule ^ (bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds) /? $ /Section_index.php?

тогда можно ли просто положить bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds в переменную вместо того, чтобы снова использовать ее в каждой строке? Если да, то как мне это сделать?

1 Ответ

1 голос
/ 04 мая 2009

Вы можете установить переменную окружения:

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]
...