以下配置:
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 错误。