Назад | Перейти на главную страницу

Nginx загружает PHP вместо рендеринга

Я пытаюсь переместить сайт Wordpress на Nginx с Apache. Когда я перехожу на основной сайт, он отображается как ожидалось. Когда я нажимаю на сообщение, он пытается загрузить index.php вместо обработки / рендеринга.

Я настраиваю nginx согласно 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». Когда я говорю ОК и загружаю его, это index.php из моего каталога wordpress.

Моя структура постоянных ссылок /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;

в блок локации. Когда я перезапускаю 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;

так $fastcgi_script_name должен содержать то же самое, но я не знаю, как это понять. Я ничего не вижу в своем public_html каталог, который выглядит как сценарий fast-cgi (хотя я могу не узнать его, когда увижу его).

Независимо от того, использую ли я свою постоянную ссылку или стандартную, нет .php в URI, поэтому я не понимаю, как эта директива местоположения даже захватывает его.

Две мысли по этому поводу:

  • Вы заявляете 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".