Я пытаюсь создать временную страницу "скоро" на веб-сайте:
rewrite ^/(css|img|js)/ - break;
rewrite ^/$ /comingsoon.html last;
rewrite ^ /? redirect;
Но у меня проблемы с флагом break
: он должен остановить обработку перезаписи правил, но похоже, что это не работает.
Я намерен:
Проблема в том, что директива 1. не работает: ее URL-адреса попадают в третье правило и перенаправляются на домашнюю страницу, как если бы первое правило не имел флага разрыва
.
Регулярное выражение в первой директиве совпадает, потому что если я заменю break
на перенаправление
, я получу 302 на -
. Таким образом, в качестве виновника остается флаг break
.
Я использую его неправильно?
Edit: Я решил это с помощью отрицательного просмотра:
rewrite ^/$ /comingsoon.html last;
rewrite ^/(?!css/|img/|js/) /? redirect;
Но мне все еще интересно понять, почему break
, похоже, не работает.
Только что включили перезапись журнала и журнала отладки и обнаружили, что ваша проблема в перезаписи на -
. В отличие от 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.
.