Как настроить постоянные ссылки в Wordpress на nginx?

Вот nginx.conf

server {
    listen      207.154.201.92:80;
    server_name interyer.su www.interyer.su;
    return 301 https://$server_name$request_uri;
    root        /home/admin/web/interyer.su/public_html;
    index       index.php index.html index.htm;
    access_log  /var/log/nginx/domains/interyer.su.log combined;
    access_log  /var/log/nginx/domains/interyer.su.bytes bytes;
    error_log   /var/log/nginx/domains/interyer.su.error.log error;


    location / {

        location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
            expires     max;
        }
       
        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ [^/]\.php(/|$) {

            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            if (!-f $document_root$fastcgi_script_name) {
                return  404;
            }

            fastcgi_pass    127.0.0.1:9001;
            fastcgi_index   index.php;
            include         /etc/nginx/fastcgi_params;
        }
    }

    error_page  403 /error/404.html;
    error_page  404 /error/404.html;
    error_page  500 502 503 504 /error/50x.html;

    location /error/ {
        alias   /home/admin/web/interyer.su/document_errors/;
    }

    location ~* "/\.(htaccess|htpasswd)$" {
        deny    all;
        return  404;
    }

    location /vstats/ {
        alias   /home/admin/web/interyer.su/stats/;
        include /home/admin/web/interyer.su/stats/auth.conf*;
    }

    include     /etc/nginx/conf.d/phpmyadmin.inc*;
    include     /etc/nginx/conf.d/phppgadmin.inc*;
    include     /etc/nginx/conf.d/webmail.inc*;

    include     /home/admin/conf/web/nginx.interyer.su.conf*;


Почему при переключении в Вордпрессе постоянных ссылок с вида https://interyer.su/?p=123 на вид https://interyer.su/sample-post/ записи и страницы начинают показывать 404 ошибку?

Вариант
location / {
                try_files $uri $uri/ /index.php?$args;
        }

взял отсюда не работает.

Помогите настроить, разобраться.
  • Вопрос задан
  • 3227 просмотров
Пригласить эксперта
Ответы на вопрос 3
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
У вас не конфиг, а какой-то винегрет...
return 301 https://$server_name$request_uri;
В рамках listen :80 вы редиректите на https?!
location / {
    try_files $uri $uri/ /index.php?$args;
}

Этот фрагмент у вас вложен в такой же
location / {
    ...
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    ...
}

Что это за чушь? В этом конфиге даже разбираться не хочется.

Вот базовый конфиг, который работает и отвечает за пермалинки в том числе:
server {
        # Слушаем 80й порт
        listen 80; 
        # Обслуживаем доменное имя, www тут же слушать не надо - будут дубликаты контента, печаль для SEO
        server_name example.com;
        # Корневая директория проекта
        root /var/www/example.com/httpdocs;

        # Индексы
        index index.php index.html;

        # Обработка запросов
        # $uri - существует ли конкретный файл
        # $uri/ - существует ли директория
        # /index.php?$args - если это не запрос на существующий файл или директорию, то перебрасываем на роутер WordPress (это и есть то, что надо для пермалинков)
        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        # Обрабатываем PHP
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                fastcgi_pass unix:/var/run/php5-fpm.sock; # или php7.0-fpm.sock
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

        # Все остальное

        # Запрещаем доступ к .htaccess
        location ~ /\.ht {
                deny all;
        }

        # Просим кешировать статику на Х дней, не писать в логи
        location ~*
        ^.+\.(js|css|swf|xml|txt|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                access_log off;
                log_not_found off;
                expires 30d;
        }

}

# Отдельно слушаем домен с www и редиректим на основной
server {
        # Слушаем 80й порт
        listen 80; 
        # Обслуживаем доменное имя c www
        server_name www.example.com;
        # Отправляем запрос на основной домен
        return 301 $scheme://example.com$request_uri;
}

Снабдил комментами для ясности.

Что касается протокола HTTPS, то во-первых, его слушать надо на отдельном порту, а во-вторых, там еще SSL-сертификат надо подключать.
Ответ написан
wp_panda
@wp_panda
к конфигу Игоря @HeadOnFire

Для убунты и 7 php дефолтный путь будет так
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Ответ написан
Комментировать
@dimax77
Игорь, сделал конфиг как вы описали, столкнулся с непонятной проблемой. У меня VPS на Ubuntu, сервер nginx, на одном сайте установил Wordpress и WooCommerce, ссылки по названию страниц и записей работают, но при нажатии на кнопку корзины, начинает грузится какой то файл, если меня настройки постоянных ссылок на произвольный вид, начинает работать кнопка, как сделать что бы она работала при ссылках по названию записей? сайт beton716.ru
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы