Рейтинг:1

Сопоставление местоположения Nginx с регулярным выражением год/месяц/день/*

флаг fm

У меня есть старый шаблон URL для перенаправления на новое место в nginx.

Типичный чистый URL выглядит так Например.com/2021/06/13/78676.html?..

Я примерно пытаюсь сопоставить количество цифр в каждом блоке, например:

расположение ~ "^[0-9]{4}/[0-9]{2}/[0-9]{2}/([0-9]+).html" {
   переписать ^ /archive.php?q=$1;
}

Где именно я ошибаюсь, пожалуйста..

Michael Hampton avatar
флаг cz
В чем проблема?
TELA avatar
флаг fm
Ой! Простите меня. Я забыл закомментировать директиву Certbot «return 404» в конце файла. Я применял это перенаправление для страниц без https. все работает нормально. Спасибо
Рейтинг:2
флаг jp

The first issue is that all Nginx URIs begin with a leading /. So your regular expression will never match.

The second issue is that numeric captures are overwritten whenever a new regular expression is evaluated. So in your configuration, $1 will always be empty.

You could use a named capture:

location ~ "^/[0-9]{4}/[0-9]{2}/[0-9]{2}/(?<value>[0-9]+)\.html" {
    rewrite ^ /archive.php?q=$value last;
}

Alternatively, place the numeric capture in the rewrite statement:

rewrite "^/[0-9]{4}/[0-9]{2}/[0-9]{2}/(?<value>[0-9]+)\.html" /archive.php?q=$1 last;

Or use a try_files statement instead of rewrite:

location ~ "^/[0-9]{4}/[0-9]{2}/[0-9]{2}/([0-9]+)\.html" {
    try_files nonexistent /archive.php?q=$1;
}
TELA avatar
флаг fm
Я обнаружил, что существует проблема с именованным захватом, если кто-то передает переменную GET 'q' вместе с URL-адресом запроса, например /2021/06/13/78676.html?a=1&q=asdf . В этом случае даже именованное значение кажется перезаписанным новым $q = asdf. Любое обходное решение?
Richard Smith avatar
флаг jp
Если вы хотите сохранить другие параметры (например, `a=1`), это будет сложно. В противном случае используйте завершающий `?` в замещающем значении в операторе `rewrite`, и исходные аргументы **не** будут добавлены. Например: `переписать ^ /archive.php?q=$value? last;` - см. [этот документ](http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite).
флаг do
Кстати, повторяя пункт, обсуждаемый в другом месте, убедитесь, что вы используете двойные кавычки в таких строках регулярных выражений, которые содержат фигурные скобки, иначе это не сработает... также не должно быть необходимости заканчивать строку каким-либо знаком `$`.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.