Изменение постоянных ссылок вызывает 404 ошибки на nginx
ПРАВКА
Оказалось, что я шел по неверному пути, пытаясь редактировать .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. Есть идеи, что здесь происходит?

Я использую 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
Также попробуйте изменить настройки постоянных ссылок.

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

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

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

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

Это правила перезаписи 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;
}

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

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

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

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

Шаг 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/

Ответ @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;
}

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