https://nginx.org/ru/docs/http/ngx_http_rewrite_mo...
Директивы break, if, return, rewrite и set обрабатываются в следующем порядке:
последовательно выполняются директивы этого модуля, описанные на уровне server;
в цикле:
ищется location по URI запроса;
последовательно выполняются директивы этого модуля, описанные в найденном location;
цикл повторяется, если URI запроса изменялся, но не более 10 раз.
server {
if (!-e $request_filename) {
rewrite ^(.*)$ /bitrix/urlrewrite.php last;
}
location ~* ^/bitrix/subws/ {
proxy_pass http://push-upstream;
...
}
Тут первыми выполняются
if
и
rewrite
, описанные на уровне
server
.
URI запроса меняется на /bitrix/urlrewrite.php и только потом начинается поиск подходящего location.
Так что в
location ~* ^/bitrix/subws/ {
запрос уже никогда не попадёт.
If is Evil... when used in location context
Сочетание if + try_files работает криво.
location / {
if (-f /var/www/bitrix/index.php) {
root /var/www/bitrix;
break;
}
if (-f /var/www/bitrix/bitrixsetup.php) {
root /var/www/bitrix;
break;
}
if (-f /var/www/bitrix/restore.php) {
root /var/www/bitrix;
break;
}
try_files $uri $uri/ @bitrix;
root /var/www/bitrix;
}
location @bitrix {
fastcgi_pass php-upstream;
Так как не работает try_files, то запрос не может попасть в
location @bitrix
. В итоге ошибка 404.
Нужно убрать:
if (-f /var/www/bitrix/index.php) {
root /var/www/bitrix;
break;
}
if (-f /var/www/bitrix/bitrixsetup.php) {
root /var/www/bitrix;
break;
}
if (-f /var/www/bitrix/restore.php) {
root /var/www/bitrix;
break;
}
if (!-e $request_filename) {
rewrite ^(.*)$ /bitrix/urlrewrite.php last;
}