Мне нужно перевести следующее правило с apache на nginx:
RewriteCond %{QUERY_STRING} id=([^&]*) [NC,OR]
RewriteCond %{QUERY_STRING} daily=([^&]*) [NC]
RewriteCond %{REQUEST_URI} !mobSpecCycle [NC]
RewriteCond %{REQUEST_URI} !mobSpecTheme [NC]
RewriteRule ^rss\/mobSpec([^\/]+)/?$ /rss/mobSpec$1/mobSpec$1_%1.html
[QSA,NC,L]
, которое, например, перезаписывает
/ rss / mobSpecArticle /? Id = 26422
в
/rss/mobSpecArticle/mobSpecArticle_26422.html
Я начал со следующего
if ($args ~ id=([^&]*)|daily=([^&]*)) {
rewrite ^/rss\/mobSpec([^\/]+)/?$ /rss/mobSpec$1/mobSpec$1_$2.html last;
}
Однако я не знаю, как сделать обратную ссылку id = ([^ &] *) в правиле перезаписи? Я положил туда 2 доллара, но это не работает ... apache имеет% 1 для обратная ссылка на совпадения из RewriteCond.
Как мне сделать обратную ссылку на совпадения из if () в nginx внутри после перезаписи?
Есть идеи, как добавить два последних условия?
RewriteCond% {REQUEST_URI}! mobSpecCycle [NC]
RewriteCond% {REQUEST_URI}! MobSpecTheme [NC]
В регулярном выражении в правиле перезаписи можно было бы сделать некоторые вещи с отрицательным прогнозированием, но я не рекомендую это делать.
Я предлагаю вам переосмыслить свой подход, а не пытаться повторить то, что у вас есть. Не пытайтесь втиснуть все в одну перезапись, и подумайте об использовании location
блоков больше и , если
меньше. Я недостаточно хорошо знаю логику вашего сайта, чтобы понять это правильно, но рассмотрим что-то вроде этого:
location /rss/mobSpecCycle {
...
}
location /rss/mobSpecTheme {
...
}
location /rss/mobSpecArticle {
rewrite /rss/mobSpecArticle/mobSpecArticle_$arg_id.html
}
location /rss/mobSpecDaily {
rewrite /rss/mobSpecArticle/mobSpecArticle_$arg_daily.html
}
Во что бы то ни стало используйте регулярное выражение в блоках location
по мере необходимости (предпочитайте это использовать if
операторов), но то, как вы покрываете оба id
и daily
в одном регулярном выражении, заставляет меня думать, что вам лучше написать что-то, что следует семантике вашего сайт лучше. Он будет более читабельным и будет выполняться лучше, чем то, что вы делаете в настоящее время.
Если вы действительно хотите следовать своему текущему подходу, регулярное выражение имеет необходимые инструменты.
Имейте в виду, что большинство людей, просматривающих вашу конфигурацию, не будут знать об этих особенностях регулярных выражений и будут сбиты с толку ими. Они также могут стать проблематичными для поддержки вашего собственного кода, особенно если вы продолжаете загружать слишком много при одной перезаписи.