Используйте переменные для упрощения правил mod_rewrite в файле .htaccess

#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} .