Nginx 下载 PHP 而不是渲染

Nginx 下载 PHP 而不是渲染

我正在尝试将 Wordpress 网站从 Apache 移至 Nginx。当我访问主站点时,它会按预期呈现。当我单击帖子时,它会尝试下载index.php而不是处理/呈现它。

我按照https://www.linode.com/docs/websites/lemp/lemp-server-on-ubuntu-16-04

我的nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

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

    gzip on;
    gzip_disable "msie6";


    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

我的li394-200.members.linode.com文件sites-available

server {
    listen 80;
    listen [::]:80;

    server_name li394-200.members.linode.com;

    root /var/www/html/li394-200.members.linode.com/public_html;
    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php$args =404;
    }

    location ~ .*\.php$ {
        include snippets/fastcgi-php.conf;
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME /var/www/html/li394-200.members.linode.com/public_html$fastcgi_script_name;
    }
}

如果我导航到http://li394-200.members.linode.com/phptest.php它按预期呈现。此外http://li394-200.members.linode.com/index.php是正确的。但如果我去http://li394-200.members.linode.com/archives/2016/11/02/international-keyboard-shortcut-day-2016/它说“您已选择打开...application/octet-stream。”当我说“确定”并下载它时,它是来自我的 wordpress 目录的 index.php。

我的永久链接结构是/archives/%year%/%monthnum%/%day%/%postname%/。如果我将永久链接更改为纯文本,我可以导航到http://li394-200.members.linode.com/?p=11240正确。

我听从了http://nginxlibrary.com/wordpress-permalinks/并添加

try_files $uri $uri/ /index.php?args;

添加到 location 块。当我重启 nginx 时,我得到了

[emerg] try_files directive is duplicate in /etc/nginx/snippets/fastcgi-php.conf:5

我甚至不知道我把这个文件包含在哪里。但这个文件看起来像

# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

so$fastcgi_script_name一定包含相同的内容,但我不知道如何查看它是什么。我没有在我的public_html目录中看到任何看起来像 fast-cgi 脚本的东西(尽管当我看到它时我可能不知道它是什么)。

无论我使用自定义永久链接还是默认永久链接,URI 中都没有.php,所以我不明白该位置指令是如何捕获它的。

答案1

对此有两点想法:

  • 您声明了default_type application/octet-stream;。请将其设置为default_type text/plain;或直接删除,因为我认为您不想提供“多用途应用程序文件”,对吗?更多信息请见此处:http://www.mime-type.net/application/octet-stream/
  • 请检查您的 php-fpm 套接字是否设置正确。可能是/var/run/... 或者如果您有一个套接字正在运行,则命名不同(检查您的 php-fpm 设置);否则大多数安装使用环回端口 9000。

编辑:

刚刚意识到您的配置还有另一个问题:您应该将“/index.php$args”或“/index.php?args”更改为“/index.php?$args”。

原因如下:nginx 匹配您的正则表达式,然后将变量“$args”设置为斜杠后面的内容。问号依次将文件名与参数分开。

因此“/index.php$args”最终会变成“/index.phpwhateverargument”,而“/index.php?args”则仍为“/index.php?args”。您想要的是“/index.php?whateverargument”。

相关内容