当前配置几乎可以正常工作。唯一的问题是,它将我的 php 文件作为静态文件提供(而不是将它们交给在端口 81 上运行的 apache2)
我知道这行代码有点问题location ~ .+(?<!\.php)
。我的负向前瞻语法有误吗?
server {
listen 80;
listen [::]:80;
root /var/www/example.com;
index index.php;
server_name example.com;
location ~ .+(?<!\.php) {
try_files $uri $uri @php;
}
location @php {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:81;
proxy_redirect http://127.0.0.1:81/ /;
proxy_read_timeout 60s;
}
location ~ /\.ht {
deny all;
}
}
答案1
我通常...
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass_header Set-Cookie;
fastcgi_pass_header Cookie;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
fastcgi_pass your_proxy;
fastcgi_index index.php;
include fastcgi.conf;
add_header X-Proxy-Cache-PHP $upstream_cache_status;
}
答案2
由于您知道您想通过 Apache 提供所有 PHP 文件,因此您考虑修改此行:
location ~ .+(?<!\.php) {
try_files $uri $uri @php;
}
到:
location ~ .+(?<!\.php) {
try_files @php $uri $uri;
}
或者,更简单一点,更改你的服务器根目录,以确保它不会在本地找到你的 PHP 文件:
root /dev/null;
基本上,您的问题是 nginx 实际上可以找到它正在寻找的文件,因此 try_files 返回原始 PHP。除非您特别想要/需要提供静态资产,否则只需将所有内容传递到您的后端,而不是寻找文件的本地副本。
答案3
以下是我所做的:
apache2.conf
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_pass http://127.0.0.1:81;
proxy_redirect http://127.0.0.1:81/ /;
proxy_read_timeout 60s;
主配置文件
server {
listen 80;
listen [::]:80;
root /var/www/example.com;
server_name example.com;
location ~ \.php {
include apache2.conf;
}
location / {
try_files $uri @php;
}
location @php {
include apache2.conf;
}
location ~ /\.ht {
deny all;
}
}
有待改进,但我认为这是我能写出的最简洁的配置。