我希望有两个 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;
以避免它们被包含的文件悄悄覆盖。