Nginx 仅提供除 php 之外的静态文件

Nginx 仅提供除 php 之外的静态文件

当前配置几乎可以正常工作。唯一的问题是,它将我的 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;
    }
}

有待改进,但我认为这是我能写出的最简洁的配置。

相关内容