启用永久链接和无扩展 php 路由在 Nginx 中不起作用

Enabling both permalinks and extensionless php routing not working in Nginx

我的 nginx.conf 文件如下:

server {
    ...    
root /var/www/html;

            # Add index.php to the list if you are using PHP
            index index.php index.html index.htm index.nginx-debian.html;

            server_name mydomain.com;

            if (!-e $request_filename)
            {
             rewrite ^.*$ /index.php last;
            }


            location / {

                    try_files $uri $uri/ @extensionless-php;
            }


            location ~ \.php$ {
                    try_files $uri =404;
                    include snippets/fastcgi-php.conf;
                    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
            }

            location @extensionless-php {
                    rewrite ^(.*)$ .php last;
            }
}

我在 Ubuntu 服务器 运行 的 Nginx 上安装了 WordPress。

我有一个名为 Resume 的导航菜单,该菜单指向 example.com/resume 并显示一个实际上是 myname_resume.pdf 的 pdf 文件,但我已将 resume.php 在根目录中,此 php 脚本获取 myname_resume.pdf 的内容并将其显示为 pdf 文件。

我希望我的 url 永远不要附加任何文件扩展名 .pdf.php 无论是否你们任何人都可以明确地写 url.php 并且它会给出相同的结果,因此我已经这样做了。当我输入以下代码时,extensionless-php 的配置工作正常:

if (!-e $request_filename)
{
    rewrite ^.*$ /index.php last;
}

因为我安装了 WordPress,所以我想为在 WordPress 上创建的页面提供永久链接 example.com/contact 并且为了启用永久链接,我必须添加上面的小配置。现在永久链接正在打开,但 mydomain.com/resume 出现 404 错误。如何启用它们,或者有什么好的方法可以实现相同的目的吗?

而不是将 .php 附加到任何不存在的文件 - 您可以更改逻辑,以便仅当 PHP 文件实际存在时才将 .php 附加到 URI .

例如:

location / {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    if (-f $request_filename.php) {
        rewrite ^ $uri.php last;
    }
    rewrite ^ /index.php last;
}
location ~ \.php$ {
    try_files $uri =404;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}

参见 this caution 关于 if 的使用。