#apache #.htaccess #mod-rewrite
#apache #.htaccess #mod-перезапись
Вопрос:
Я унаследовал файл .htaccess с чрезвычайно сложным набором правил mod_rewrite, в нем около 100 строк с большим количеством дубликатов, похожих на это:
RewriteCond %{REQUEST_URI} !^/(test|dev|((current|archive|all|2x|19|20|21|22|23|24|25|26|27)/([a-z]{2}|pt_br)))/favicon.ico
RewriteCond %{REQUEST_URI} !^/(test|dev|((current|archive|all|2x|19|20|21|22|23|24|25|26|27)/([a-z]{2}|pt_br)))/robots.txt
RewriteRule ^(test|dev|((current|archive|all|2x|19|20|21|22|23|24|25|26|27)/([a-z]{2}|pt_br)))/(.*) /index.php?title=$5 [L,QSA,S=1]
(Обратите внимание, что правила имеют небольшие различия и не все одинаковы, но между ними есть составные части.)
Я хотел бы использовать переменные, чтобы сделать эти правила более удобными для обслуживания, возможно ли это? Что-то слишком длинные строки этого псевдопример:
# define variables
versions=(current|archive|all|2x|19|20|21|22|23|24|25|26|27)
languages=(current|archive|all|2x|19|20|21|22|23|24|25|26|27)
# body of rules
RewriteCond %{REQUEST_URI} !^/(test|dev|($versions/$languages))/favicon.ico
RewriteCond %{REQUEST_URI} !^/(test|dev|($versions/$languages))/robots.txt
RewriteRule ^(test|dev|($versions/$languages)/(.*) /index.php?title=$5 [L,QSA,S=1]
Ответ №1:
Ну, вы не можете хранить частичное регулярное выражение в таких переменных, как это.
В качестве обходного пути вы можете установить переменные env, если эти условия верны:
RewriteRule (current|archive|all|2x|19|20|21|22|23|24|25|26|27) - [E=VERSION:$1]
RewriteRule (current|archive|all|2x|19|20|21|22|23|24|25|26|27) - [E=LANG:$1]
Как только это будет сделано, вы можете использовать эти переменные среды в своих правилах, например, в ваших условиях:
RewriteCond %{ENV:VERSION} .
или
RewriteCond %{ENV:LANG} .