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

18

РЕДАКТИРОВАТЬ

Оказалось, что я неправильно лаял дерево, пытаясь редактировать .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;
    }

    # This location block matches anything ending in .php and sends it to
    # our PHP-FPM socket, defined in the upstream block above.
    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;
    }

    # This location block is used to view PHP-FPM stats
    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;
    }

    # This location block is used to view nginx stats
    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;
    }

    # Uncomment one of the lines below for the appropriate caching plugin (if used).
    #include global/wordpress-wp-super-cache.conf;
    #include global/wordpress-w3-total-cache.conf;

    # This location block matches anything ending in .php and sends it to
    # our PHP-FPM socket, defined in the upstream block above.
    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;
    }

    # This location block is used to view PHP-FPM stats
    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;
    }

    # This location block is used to view nginx stats
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

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

КОНЕЦ РЕДАКТИРОВАНИЯ

Я изменил мои постоянные ссылки со значения по умолчанию на /% postname% /, и теперь ссылки в панели администратора WordPress дают мне 404 ошибки - не WordPress 404 страницы, nginx 404 страницы. Посмотрев, почему это говорит мне, что это должно быть редактирование моего файла .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. Есть идеи о том, что здесь происходит?

ninjachicken1
источник

Ответы:

13

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

# WordPress single blog rules.
# Designed to be included in any server {} block.

# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
    try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Directives to send expires headers and turn off 404 error logging.
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;
}

# Uncomment one of the lines below for the appropriate caching plugin (if used).
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    # This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default)

    include fastcgi.conf;
    fastcgi_index index.php;
#   fastcgi_intercept_errors on;
    fastcgi_pass php;
}
s_ha_dum
источник
Спасибо, я бы проголосовал, если бы у меня была репутация. У меня возникли небольшие проблемы с внедрением этого в мой файл .conf, поскольку он уже значительно изменился по умолчанию, но, по крайней мере, я больше не возился с .htaccess.
ninjachicken1
@s_ha_dum, я использовал эту конфигурацию до вчерашнего дня, когда я обновился до WordPress 4.8, и теперь я получаю 404 с на пользовательской структуре постоянных ссылок .... пробовал отлаживать его со вчерашнего дня, но ничего не изменится, есть идеи ??
Jadeye
Мне пришлось изменить последнюю строку, чтобы прочитать «fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;» работать на Ubuntu 18.04, но это работает и спасло мое здравомыслие
Роб
18

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

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

На сервере {

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

Если ваш корневой wordpress не webroot, а http://domain.com/wordpress/ :

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

Если вы используете старый wordpress с blogs.dir, добавьте: location ^ ~ /blogs.dir {internal; псевдоним /var/www/wordpress/wp-content/blogs.dir; access_log off; log_not_found off; истекает максимум; }

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

Перезагрузить nginx: sudo service nginx reload

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

Доми
источник
4
Это лучший ответ для всех, кто хочет вручную переместить установку WordPress в подкаталог с новым доменным именем! СПАСИБО БОЛЬШОЕ! Это должен быть принятый ответ.
specialk1st
1
Путь: / etc / nginx / site-available / следует читать: / etc / nginx / sites-available /
Предоставить
6

Пришлось добавить этот кусок кода как /sites-available/your-settings-fileи /sites-enabled/your-settings-file:

server {
[...]

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

[...]
}

Это работает для меня сейчас.

Анджело Реале
источник
1
Это простой ответ, который я искал, спасибо
ThEBiShOp
1
Это сработало! Не могли бы вы объяснить, что это делает? (особенно «последняя» часть ...)
Сидд
1

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

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

Mendas
источник