从类似 SEO 的 URL 重定向时,nginx 不会执行 PHP 代码

从类似 SEO 的 URL 重定向时,nginx 不会执行 PHP 代码

与其他与 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

您的 SEO 解决方案正在使用非推荐的if指令内部location如果是邪恶的

指令在上下文if中使用时会出现问题location,在某些情况下,它不会按照您的预期执行,而是执行完全不同的操作。在某些情况下,它甚至会出现段错误。如果可能的话,最好避免这种情况。

实现我认为你想要的目标的正确方法是try_files,例如:

location / {
    try_files $uri $uri/ @missing;
}

location @missing {
    rewrite ^(.*)$ /index.php break;
}

答案3

进入服务器位置放置

error_page 404 =200 /index.php;

将所有 404(未找到)页面重定向到您的 index.php

如果您只是想捕获所有丢失的页面,则不需要所有的重写和定位内容。

相关内容