nginx: обратная ссылка совпадает с if () и перезаписывается одновременно

Мне нужно перевести следующее правило с 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.

  1. Как мне сделать обратную ссылку на совпадения из if () в nginx внутри после перезаписи?

  2. Есть идеи, как добавить два последних условия?

RewriteCond% {REQUEST_URI}! mobSpecCycle [NC] RewriteCond% {REQUEST_URI}! MobSpecTheme [NC]

0
задан 5 June 2017 в 20:00
1 ответ

В регулярном выражении в правиле перезаписи можно было бы сделать некоторые вещи с отрицательным прогнозированием, но я не рекомендую это делать.

Я предлагаю вам переосмыслить свой подход, а не пытаться повторить то, что у вас есть. Не пытайтесь втиснуть все в одну перезапись, и подумайте об использовании 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 в одном регулярном выражении, заставляет меня думать, что вам лучше написать что-то, что следует семантике вашего сайт лучше. Он будет более читабельным и будет выполняться лучше, чем то, что вы делаете в настоящее время.

Если вы действительно хотите следовать своему текущему подходу, регулярное выражение имеет необходимые инструменты.

  1. вы можете использовать PCRE named capture .
  2. Ваша проблема с двумя последними условиями может быть решена с помощью утверждений с отрицательным прогнозированием.

Имейте в виду, что большинство людей, просматривающих вашу конфигурацию, не будут знать об этих особенностях регулярных выражений и будут сбиты с толку ими. Они также могут стать проблематичными для поддержки вашего собственного кода, особенно если вы продолжаете загружать слишком много при одной перезаписи.

1
ответ дан 4 December 2019 в 16:14

Теги

Похожие вопросы