<a href="https://nginx.org/ru/docs/http/ngx_http_rewrite_module.html" rel="nofollow">https://nginx.org/ru/docs/http/ngx_http_rewrite_mo...</a> <br/> <br/> <blockquote>Директивы break, if, return, rewrite и set обрабатываются в следующем порядке:<br/>
<br/>
последовательно выполняются директивы этого модуля, описанные на уровне server;<br/>
в цикле:<br/>
ищется location по URI запроса;<br/>
последовательно выполняются директивы этого модуля, описанные в найденном location;<br/>
цикл повторяется, если URI запроса изменялся, но не более 10 раз.</blockquote> <br/> <br/> <pre><code class="nginx">server {
if (!-e $request_filename) {
rewrite ^(.*)$ /bitrix/urlrewrite.php last;
}
location ~* ^/bitrix/subws/ {
proxy_pass http://push-upstream;
...
}</code></pre> <br/> Тут первыми выполняются <code class="nginx">if</code> и <code class="nginx">rewrite</code> , описанные на уровне <code class="nginx">server</code> . <br/> URI запроса меняется на /bitrix/urlrewrite.php и только потом начинается поиск подходящего location. <br/> Так что в <code class="nginx">location ~* ^/bitrix/subws/ {</code> запрос уже никогда не попадёт. <br/> <br/> <a href="https://github.com/nginxinc/nginx-wiki/blob/836ecd605a1b9861fb608e848336bca9b8640b54/source/start/topics/depth/ifisevil.rst" rel="nofollow">If is Evil... when used in location context</a> <br/> Сочетание if + try_files работает криво. <br/> <pre><code class="nginx">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;</code></pre> <br/> Так как не работает try_files, то запрос не может попасть в <code class="nginx">location @bitrix</code> . В итоге ошибка 404. <br/> <br/> Нужно убрать: <br/> <pre><code class="nginx">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;
}</code></pre> <br/> <br/> <pre><code class="nginx">if (!-e $request_filename) {
rewrite ^(.*)$ /bitrix/urlrewrite.php last;
}</code></pre>