我正在尝试将 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”。