nginx 使用try_files时发生连锁反应,当服务器返回状态码500时导致双重提交

nginx 使用try_files时发生连锁反应,当服务器返回状态码500时导致双重提交

以下配置:

 location ~ /{
        try_files /$uri /$uri/ /index.php?q=$uri&$args;
    }

当服务器返回 500 时,这将尝试几件事。它将沿着链向下尝试下一件事。但是:由于它是一个失败的表单,因此表单被重新提交,并且直到出现错误代码之前发生的事情,因此发生了两次。有没有办法只尝试一件事try_files或替代try_files

在最后使用=500不是一个解决方案,因为它不会显示错误页面。

编辑我添加了完整的服务器块。

我的 wordpress 和 laravel 设置有点复杂。Wordpress 位于主文件夹中,而所有caup_api对子文件夹的调用都需要转到 laravel 安装。因此我有一个软链接 caup_api -> ./caup_laravel/public/

这样我就可以使用所有正常情况下在 caup_api 文件夹中进行的调用,这些调用会直接发送到 laravel,而不会由 wordpress 处理。有问题的配置是带有caup_api

server {
    listen 80;

 server_name dev.myapp.org;

     root /var/www/html/dev.myapp.org/public;

    index index.html index.htm index.php;


    access_log  /var/log/nginx/nginx_lukas23.com.access.log;
    error_log  /var/log/nginx/nginx_lukas23.com.error.log;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt { access_log off; log_not_found off; }
    location = /apple-touch-icon.png { access_log off; log_not_found off; }
    location = /apple-touch-icon-precomposed.png { access_log off; log_not_found off; }
    location ~ /\.ht { deny  all; access_log off; log_not_found off; }


location / {
try_files $uri $uri/ /index.php?q=$uri&$args;

    }

   location ~ \.php$ {
        proxy_intercept_errors on;
        error_page 500 501 502 503 = @fallback;
        fastcgi_buffers 8 256k;
        fastcgi_buffer_size 128k;
        fastcgi_intercept_errors on;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        ##fastcgi_pass   127.0.0.1:9900;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        ##fastcgi_pass hhvm;
    }
    location @fallback {
        fastcgi_buffers 8 256k;
        fastcgi_buffer_size 128k;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        ##fastcgi_pass   127.0.0.1:9900;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

        ##fastcgi_pass jcrdev;
    }
    location ~* .(css|js|png|jpg|jpeg|gif|ico)$ { expires 1d; }

   location ~ /caup_api {
        try_files /caup_api/$uri /caup_api/$uri/ /caup_api/index.php?q=$uri&$args;
    }

    location ~ /causes {
        try_files /caup_api/$uri /caup_api/$uri/ /caup_api/index.php?q=$uri&$args;
    }
}

答案1

您的代码运行了两次,因为您明确要求它运行两次。

首先,try_files找到你的 URL,或者更具体地说没有找到你的 URL,因此它会运行你的 PHP 脚本,因为你以 结尾/index.php?...。这会导致 nginx 使用 中的指令执行你的脚本location ~ \.php$

当返回 500 错误时,error_page 500 ...其中的指令就会location生效。这会告诉 nginx 传递特定文档,而不是其自己的内部 500 错误页面。就您而言,它会告诉 nginx 访问该@fallback位置,这会再次调用您的 PHP 代码。

为了解决这个问题,您需要更仔细地考虑当程序中出现 500 错误时您希望发生什么,或者更好的是,不要返回 500 错误。

相关内容