Как работает флаг прерывания перезаписи nginx?

Я пытаюсь создать временную страницу "скоро" на веб-сайте:

rewrite ^/(css|img|js)/ -                break;
rewrite ^/$             /comingsoon.html last;
rewrite ^               /?               redirect;

Но у меня проблемы с флагом break : он должен остановить обработку перезаписи правил, но похоже, что это не работает.

Я намерен:

  1. обслуживать все файлы css, img и js в том виде, в каком они есть;
  2. обслуживать страницу comesoon.html вместо домашняя страница;
  3. (временно) перенаправить все остальные страницы на домашнюю.

Проблема в том, что директива 1. не работает: ее URL-адреса попадают в третье правило и перенаправляются на домашнюю страницу, как если бы первое правило не имел флага разрыва .

Регулярное выражение в первой директиве совпадает, потому что если я заменю break на перенаправление , я получу 302 на - . Таким образом, в качестве виновника остается флаг break .

Я использую его неправильно?


Edit: Я решил это с помощью отрицательного просмотра:

rewrite ^/$                 /comingsoon.html last;
rewrite ^/(?!css/|img/|js/) /?               redirect;

Но мне все еще интересно понять, почему break , похоже, не работает.

-1
задан 1 June 2016 в 18:26
1 ответ

Только что включили перезапись журнала и журнала отладки и обнаружили, что ваша проблема в перезаписи на -. В отличие от Apache, nginx воспринимает его буквально и перезаписывает запрос URI на строку -. Тогда он не может найти ни одного блока location, который бы соответствовал этому URI и использует его magic configuration "", который просто случайно имеет все серверные правила перезаписи . Таким образом, новый URI снова проходит через все правила перезаписи.

Вот журнал:

2016/06/01 19:52:41 [debug] 7288#7288: *24 http header: "Host: example.com"
2016/06/01 19:52:41 [debug] 7288#7288: *24 http header: "User-Agent: curl/7.47.0"
2016/06/01 19:52:41 [debug] 7288#7288: *24 http header: "Accept: */*"
2016/06/01 19:52:41 [debug] 7288#7288: *24 http header done
2016/06/01 19:52:41 [debug] 7288#7288: *24 event timer del: 4: 1464800021049
2016/06/01 19:52:41 [debug] 7288#7288: *24 generic phase: 0
2016/06/01 19:52:41 [debug] 7288#7288: *24 rewrite phase: 1
2016/06/01 19:52:41 [debug] 7288#7288: *24 http script regex: "^/css/"
2016/06/01 19:52:41 [notice] 7288#7288: *24 "^/css/" matches "/css/asd", client: 127.0.0.1, server: example.com, request: "GET /css/asd HTTP/1.1", host: "example.com"
2016/06/01 19:52:41 [debug] 7288#7288: *24 http script copy: "-"
2016/06/01 19:52:41 [debug] 7288#7288: *24 http script regex end
2016/06/01 19:52:41 [notice] 7288#7288: *24 rewritten data: "-", args: "", client: 127.0.0.1, server: example.com, request: "GET /css/asd HTTP/1.1", host: "example.com"
2016/06/01 19:52:41 [debug] 7288#7288: *24 test location: "/"
2016/06/01 19:52:41 [debug] 7288#7288: *24 using configuration ""
2016/06/01 19:52:41 [debug] 7288#7288: *24 http cl:-1 max:1048576
2016/06/01 19:52:41 [debug] 7288#7288: *24 rewrite phase: 3
2016/06/01 19:52:41 [debug] 7288#7288: *24 rewrite phase: 4
2016/06/01 19:52:41 [debug] 7288#7288: *24 http script regex: "^/css/"
2016/06/01 19:52:41 [notice] 7288#7288: *24 "^/css/" does not match "-", client: 127.0.0.1, server: example.com, request: "GET /css/asd HTTP/1.1", host: "example.com"
2016/06/01 19:52:41 [debug] 7288#7288: *24 http script regex: "^/$"
2016/06/01 19:52:41 [notice] 7288#7288: *24 "^/$" does not match "-", client: 127.0.0.1, server: example.com, request: "GET /css/asd HTTP/1.1", host: "example.com"
2016/06/01 19:52:41 [debug] 7288#7288: *24 http script regex: "^"
2016/06/01 19:52:41 [notice] 7288#7288: *24 "^" matches "-", client: 127.0.0.1, server: example.com, request: "GET /css/asd HTTP/1.1", host: "example.com"
2016/06/01 19:52:41 [debug] 7288#7288: *24 http script copy: "/"
2016/06/01 19:52:41 [debug] 7288#7288: *24 http script regex end
2016/06/01 19:52:41 [notice] 7288#7288: *24 rewritten redirect: "/", client: 127.0.0.1, server: example.com, request: "GET /css/asd HTTP/1.1", host: "example.com"

Исправление первоначальной проблемы может быть таким же простым, как:

rewrite ^(/(css|img|js)/.+) $1 break;

или

rewrite ^/(css|img|js)/ $uri break;

Итак, вы должны позаботиться о том, что вы переписываете свой URI.

.
2
ответ дан 5 December 2019 в 19:24

Теги

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