Изменение постоянных ссылок вызывает 404 ошибки на nginx

21 мая 2015 г., 19:30:36
Просмотры: 51.5K
Голосов: 25

ПРАВКА

Оказалось, что я шел по неверному пути, пытаясь редактировать .htaccess, так как nginx его не использует. Мне нужно было редактировать файл .conf. До этого мой my_app.conf выглядел так:

upstream backend {
    server unix:/u/apps/my_app/tmp/php.sock;
}

server {

    listen 80 default;
    root /u/apps/my_app/www;
    index index.php;

    access_log /u/apps/my_app/logs/access.log;
    error_log /u/apps/my_app/logs/error.log;

    location / {
        try_files $uri $uri/ /index.php;
    }

    # Этот блок location обрабатывает все файлы с расширением .php и отправляет их на
    # наш сокет PHP-FPM, определенный в блоке upstream выше
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /u/apps/my_app/www$fastcgi_script_name;
        include fastcgi_params;
    }

    # Этот блок location используется для просмотра статистики PHP-FPM
    location ~ ^/(php_status|php_ping)$ {
        fastcgi_pass backend;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        include fastcgi_params;
        allow 127.0.0.1;
        deny all;
    }

    # Этот блок location используется для просмотра статистики nginx
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

Теперь он выглядит так, но все еще не работает:

upstream backend {
    server unix:/u/apps/my_app/tmp/php.sock;
}

server {

    listen 80 default;
    root /u/apps/my_app/www;
    index index.php;

    access_log /u/apps/my_app/logs/access.log;
    error_log /u/apps/my_app/logs/error.log;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location /wordpress/ {
        try_files $uri $uri/ /index.php?$args;
    }

    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    location ~* ^.+\.(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 max;
    }

    # Раскомментируйте одну из строк ниже для соответствующего плагина кэширования (если используется).
    #include global/wordpress-wp-super-cache.conf;
    #include global/wordpress-w3-total-cache.conf;

    # Этот блок location обрабатывает все файлы с расширением .php и отправляет их на
    # наш сокет PHP-FPM, определенный в блоке upstream выше
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /u/apps/my_app/www$fastcgi_script_name;
        include fastcgi_params;
    }

    # Этот блок location используется для просмотра статистики PHP-FPM
    location ~ ^/(php_status|php_ping)$ {
        fastcgi_pass backend;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        include fastcgi_params;
        allow 127.0.0.1;
        deny all;
    }

    # Этот блок location используется для просмотра статистики nginx
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

Кто-нибудь знает, что я делаю неправильно?

КОНЕЦ ПРАВКИ

Я изменил постоянные ссылки с настроек по умолчанию на /%postname%/, и теперь ссылки в панели администратора WordPress выдают 404 ошибки - не страницы 404 WordPress, а 404 страницы nginx. Поиск причины подсказал, что нужно редактировать файл .htaccess или что WordPress не может перезаписать .htaccess - файл .htaccess отсутствует, и WordPress не выдает никаких ошибок при изменении постоянных ссылок.

Я попробовал создать пустой файл .htaccess в папке wordpress, установил права 666, изменил пользователя и группу на www-data, а затем изменил постоянные ссылки - это не сработало. Затем я изменил его на следующее перед изменением постоянных ссылок:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Когда это не сработало, я изменил RewriteBase на /wordpress/ перед повторным изменением постоянных ссылок - всё равно ничего.

Я также зашел в файл .conf моего сайта и изменил try_files $uri $uri/ /index.php; на следующее, перезапуская nginx и php5-fpm каждый раз:

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

try_files $uri $uri/ /index.php?q=$request_uri;

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

Я запускаю домашний сервер на nginx. Есть идеи, что здесь происходит?

0
Все ответы на вопрос 7
4
32

Я использую WordPress Multisite с пользовательскими настройками постоянных ссылок: /%category%/%postname%/

/etc/nginx/site-available/domain.conf

В блоке server{

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

Если корень WordPress не является корнем веб-сайта, а находится по адресу http://domain.com/wordpress/:

location /wordpress/ {
    try_files $uri $uri/ /wordpress/index.php?q=$uri$args;
}

Если вы используете старую версию WordPress с blogs.dir, добавьте:

location ^~ /blogs.dir {
    internal;
    alias /var/www/wordpress/wp-content/blogs.dir;
    access_log off; log_not_found off; expires max;
}

Проверьте конфигурацию nginx:

sudo nginx -t

Перезагрузите nginx:

sudo service nginx reload

Также попробуйте изменить настройки постоянных ссылок.

30 нояб. 2016 г. 20:08:16
Комментарии

Это лучший ответ для тех, кто хочет вручную перенести установку WordPress в подкаталог под новым доменным именем! ОГРОМНОЕ СПАСИБО! Этот ответ должен быть принятым.

specialk1st specialk1st
24 янв. 2017 г. 15:25:04

Путь: /etc/nginx/site-available/ должен быть: /etc/nginx/sites-available/

Grant Grant
20 февр. 2018 г. 12:14:01

Второй вариант сработал для меня, так как мой сайт находился в подкаталоге

Arunendra Arunendra
19 окт. 2020 г. 05:37:08

Я зарегистрировался на этом форуме только чтобы поблагодарить вас. Слава вам, мудрый человек! Я уже собирался рвать на себе волосы, когда ваше решение спасло меня. Контекст: я перенес базу данных WordPress с одного Ubuntu-хоста на другой и использую Nginx для работы с WP.

JovanToroman JovanToroman
26 окт. 2023 г. 18:22:02
3
18

Это правила перезаписи Apache .htaccess, но вы указали, что используете сервер Nginx. Nginx не использует файлы уровня директорий, подобные .htaccess, и тем более сам файл .htaccess. Вам нужно редактировать непосредственно конфигурацию сервера. Кодекс содержит детальный пример:

# Правила для одиночного блога WordPress.
# Предназначены для включения в любой блок server {}.

# Этот порядок может показаться странным — он предназначен для совпадения в последнюю очередь, если правила ниже не сработают.
# http://wiki.nginx.org/HttpCoreModule
location / {
    try_files $uri $uri/ /index.php?$args;
}

# Добавляет завершающий слэш к запросам */wp-admin.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Директивы для отправки заголовков expires и отключения логирования ошибок 404.
location ~* ^.+\.(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 max;
}

# Раскомментируйте одну из строк ниже для соответствующего плагина кеширования (если используется).
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;

# Передавать все .php-файлы на сервер php-fpm/php-fcgi.
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    # Это надежное решение для проблемы безопасности path info и работает с "cgi.fix_pathinfo = 1" в /etc/php.ini (по умолчанию)

    include fastcgi.conf;
    fastcgi_index index.php;
#   fastcgi_intercept_errors on;
    fastcgi_pass php;
}
21 мая 2015 г. 19:48:16
Комментарии

Спасибо, я бы проголосовал за это, если бы у меня была репутация. У меня возникли небольшие трудности с внедрением этого в мой .conf файл, так как он уже значительно изменён по сравнению с дефолтным, но по крайней мере я больше не возюсь с .htaccess.

ninjachicken1 ninjachicken1
21 мая 2015 г. 22:32:50

@s_ha_dum, я использовал эту конфигурацию до вчерашнего дня, когда обновился до WordPress 4.8, и теперь получаю 404 ошибки на пользовательских структурах постоянных ссылок... пытался отладить это со вчерашнего дня, но ничего не работает, есть идеи??

Jadeye Jadeye
4 июл. 2017 г. 17:32:09

Мне пришлось изменить последнюю строку на "fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;" чтобы это заработало на Ubuntu 18.04, но теперь всё работает и это спасло моё здравомыслие

Rob Rob
17 дек. 2018 г. 05:24:27
6
12

Пришлось добавить этот фрагмент кода в оба файла: /sites-available/ваш-файл-настроек и /sites-enabled/ваш-файл-настроек:

server {
[...]

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

[...]
}

Теперь всё работает как нужно.

6 апр. 2017 г. 08:38:16
Комментарии

Это именно тот простой ответ, который я искал, спасибо

ThEBiShOp ThEBiShOp
28 июн. 2017 г. 22:15:47

Это сработало! Не могли бы вы объяснить, что делает этот код? (особенно часть с "last"...)

Sidd Sidd
12 авг. 2018 г. 21:50:25

Этот код до сих пор работает!

Julio de Leon Julio de Leon
16 сент. 2020 г. 20:34:00

Файлы в sites-enabled/ являются символическими ссылками на файлы из sites-available/, поэтому по сути вы редактируете файл внутри sites-available/, и изменения автоматически отразятся в другой папке. Просто уточнение.

RP McMurphy RP McMurphy
15 янв. 2021 г. 20:39:02

Могу подтвердить, что это всё ещё работает отлично!

terryeah terryeah
2 апр. 2022 г. 05:11:34

Это правильный ответ. Огромное спасибо. Может кто-нибудь объяснить, в чём была проблема и как это её решило?

music music
4 мар. 2023 г. 11:46:24
Показать остальные 1 комментариев
0

Мне пришлось установить корневой путь в директорию установки WordPress: root /var/www/html/wp;

Мне это не нравится, так как на этой машине установлено больше приложений, но создание дополнительных виртуальных хостов должно решить проблему.

7 авг. 2018 г. 17:07:42
0

Шаг 1. Редактирование файла /etc/nginx/site-available/example.com

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

Шаг 2. Вход на сервер Шаг 3. Выполните следующую команду для создания символьной ссылки вашего домена

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

Шаг 4. Проверка конфигурации

sudo nginx -t

Шаг 5. Перезапуск сервера Nginx

sudo systemctl restart nginx

Шаг 6. Сохраните постоянные ссылки в админ-панели WordPress ***** Приятного просмотра *****

Подробнее http://toihid.com/wordpress-permalink-in-nginx-server/

19 мая 2020 г. 11:52:56
0

Ответ @Angelo решил мою проблему. Я бы поставил плюс, но у меня недостаточно репутации, поэтому публикую ответ.

Для ясности, следующий код:

server {
        server_name xxx.xxxx.com;
        
        root /var/www/wordpress;

        listen 80;
        listen [::]:80;

        index index.php;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        }
}

был изменён на:

server {
        server_name xxx.xxxx.com;
        
        root /var/www/wordpress;

        listen 80;
        listen [::]:80;

        index index.php;

        location / {
                try_files $uri $uri/ =404;
        }

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

        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        }
}

Обратите внимание на добавленный блок:


        if (!-e $request_filename) {
                rewrite ^.*$ /index.php last;
        }
23 авг. 2023 г. 12:36:37
0

Вот решение, которое сработало для меня на относительно новом сервере. На сервере никогда не работал Apache. При изменении постоянных ссылок все страницы, кроме главной, выдавали ошибку 404. Я включил Apache вместо Nginx, затем ИЗМЕНИЛ настройки постоянных ссылок и сохранил. После этого, скорее всего, снова изменил их на желаемые и сохранил. Это создало файл .htaccess. Затем я снова включил Nginx, и всё заработало.

Nginx имеет систему для чтения файла .htaccess и настройки себя на его основе. Но пока файла .htaccess нет, он не может этого сделать.

Это было на Plesk, WordPress 6.5 и PHP 8.2 под Linux.

16 апр. 2024 г. 00:11:04