Зміна постійних посилань дає мені 404 помилки на nginx


18

EDIT

Виявляється, я бракував неправильне дерево, намагаючись редагувати .htaccess, оскільки nginx не використовує його. Що, мабуть, мені потрібно зробити, це відредагувати мій файл .conf. Перш ніж я прочитав це, мій_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;
    }
}

Хтось знає, що я роблю неправильно?

END EDIT

Я змінив свої постійні посилання з стандартних на /% пост-ім’я% /, і тепер посилання на панелі адміністратора WordPress дають мені 404 помилки - не WordPress 404 сторінки, nginx 404 сторінки. Шукаю, чому мені сказано, що це повинно редагувати мій файл .htaccess або сказати мені, що WordPress не може переписати.

Я спробував створити порожній. Потім я змінив це на це перед тим, як змінити постійні посилання:

# 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. Будь-які ідеї про те, що тут відбувається?

Відповіді:


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;
}

Дякую, я би проголосував за це, якби мав репутацію. У мене виникають невеликі труднощі при впровадженні цього в мій файл .conf, бачачи, що він вже значно змінився з типового, але, принаймні, я вже не обмінююся з .htaccess.
ninjachicken1

@s_ha_dum, я використовував цю конфігурацію до вчора, коли я оновлювався до wordpress 4.8, і тепер я отримую 404s на спеціальній структурі постійна посилання .... спробував налагодити це з вчора, але нічого не стосується, будь-які ідеї ??
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 вимкнено; log_not_found off; закінчується макс; }

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

Перезавантажити nginx: перезавантажити службу sudo для nginx

Спробуйте також змінити параметри постійної посилання.


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
Це спрацювало! Не могли б ви пояснити, що це робить? (особливо "остання" частина ...)
Sidd

1

Мені довелося встановити кореневий шлях до каталогу, встановленого wordpressś: root / var / www / html / wp;

Мені це не подобається, оскільки у мене на цій машині встановлено більше додатків, але створення більше віртуальних хостів повинно вистачити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.