Несколько местоположений proxy_pass с php

Я хотел бы иметь два местоположения proxy_pass и общее местоположение php-fpm, так что любой запрос.php будет перенаправлен на fpm-php, но любой запрос к / el /... или / gl /... перейдет к этим местах. Это то, что я до сих пор:

server {
listen *:443 ssl;    

ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;

client_max_body_size 108M;

access_log /var/log/nginx/access.log;

root /var/www/public;
index index.php;

if (!-e $request_filename) {
    rewrite ^.*$ /index.php last;
}

location /es/ {
    proxy_pass http://<my-domain>:8200/;
}

location /gl/ {
    proxy_pass http://<my-domain>:3000/;
}

location / {

   location ~ \.php$ {
       fastcgi_pass <my-domain>:9000;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PHP_VALUE "error_log=/var/log/nginx/php_errors.log";
       fastcgi_buffers 16 16k;
       fastcgi_buffer_size 32k;
       include fastcgi_params;
  }
}
}

Эта конфигурация терпит неудачу по всем трем счетам. Однако удаление всего местоположения php и оператора 'if' работает для местоположений / es / и / gl /, ​​поэтому я предполагаю, что я неправильно выполняю бит php. Каков наилучший способ достичь этого? Благодарю.

1 ответ

Решение

Вы должны переписать:

if (!-e $request_filename) { rewrite ^.*$ /index.php last; }

как:

try_files $uri $uri/ /index.php;

и переместить его в location / блок, чтобы избежать неприятных конфликтов с глобальными if а также rewrite заявления.

Использовать ^~ модификатор местоположений префиксов, которые имеют приоритет над расположениями регулярных выражений. Смотрите этот документ для деталей.

Например:

root /var/www/public;
index index.php;

location ^~ /es/ {
    proxy_pass http://<my-domain>:8200/;
}

location ^~ /gl/ {
    proxy_pass http://<my-domain>:3000/;
}

location / {
    try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
    try_files $uri =404;

    fastcgi_pass <my-domain>:9000;
    include fastcgi_params;

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PHP_VALUE "error_log=/var/log/nginx/php_errors.log";
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
}

Поместите свой fastcgi_param заявления после include fastcgi_params; чтобы они не перезаписывались включенным файлом.

Другие вопросы по тегам