与其他与 nginx 不执行 PHP 文件相关的问题不同,我的问题确实如此,问题出现在我使用类似 SEO 的 URL 并重定向到 php 脚本时,它不会执行代码,而是将脚本作为纯文本发送到浏览器。
基本上我想要的是,每个发送到没有实际文件的 HTTP 服务器的请求都会执行 index.php 脚本并将其输出返回到浏览器。但实际发生的情况是,我得到的是 index.php 中的代码。
这是我的配置文件中执行重定向的部分。它实际上是从以前的 Apache 的 .htaccess 文件翻译而来的:
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php break;
}
}
这些是 PHP 相关的指令,实际上这些指令位于配置文件中的上一个指令之前:
location ~ \.php$ {
try_files /dd05cf208ebd3d4559f3af75016a1e3d.htm @php;
}
location @php {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/lib/php7.0-fpm/web4.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
}
我已经使用带有 mod_php 的 Apache 几十年了,并且等效指令开箱即用,但我对 Nginx 还不熟悉,我不知道从哪里开始调试它。
答案1
在 nginx 中实现前端控制器模式的正确方法如下:
location / {
try_files $uri $uri/ /index.php;
}
您的 PHP 位置块看起来有点奇怪。我猜您配置的目的是让 nginx 在/dd05cf208ebd3d4559f3af75016a1e3d.htm
文件存在时显示维护通知。
这种配置对我来说看起来是正确的,只是try_files
你的@php
块内部使得请求失败,因为它使 nginx 查找 URI 中指定名称的文件,并且对于友好的 URL,这些文件根本不存在。
没有理由包括这一点,所以您的 PHP 配置应该如下所示。
location ~ \.php$ {
try_files /dd05cf208ebd3d4559f3af75016a1e3d.htm @php;
}
location @php {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/lib/php7.0-fpm/web4.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
}
答案2
答案3
进入服务器位置放置
error_page 404 =200 /index.php;
将所有 404(未找到)页面重定向到您的 index.php
如果您只是想捕获所有丢失的页面,则不需要所有的重写和定位内容。