Zmiana permalinków daje mi 404 błędów w nginx

18

EDYTOWAĆ

Okazuje się, że szczekałem na złe drzewo, próbując edytować plik .htaccess, ponieważ nginx go nie używa. Najwyraźniej muszę zrobić edycję pliku .conf. Zanim to przeczytałem, my_app.conf wyglądał tak:

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

Teraz wygląda tak i nadal nie działa:

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

Czy ktoś wie, co robię źle?

EDYCJA KOŃCOWA

Zmieniłem moje permalinki z domyślnego na /% postname% /, a teraz linki w panelu administracyjnym WordPressa dają mi błędy 404 - nie strony WordPress 404, strony nginx 404. Sprawdzam, dlaczego powiedziano mi, że powinienem edytować mój plik .htaccess lub powiedzieć, że WordPress nie może przepisać pliku .htaccess - plik .htaccess jest nieistniejący, a WordPress nie wyświetla żadnych błędów, gdy zmieniam permalinki.

Próbowałem utworzyć pusty plik .htaccess w moim folderze Wordpress, nadając mu uprawnienia 666, zmieniając użytkownika i grupę na www-data, a następnie zmieniając łącza bezpośrednie - to nie działało. Następnie zmieniłem to na to przed zmianą permalinków:

# 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

Kiedy to nie zadziałało, zmieniłem RewriteBasena, /wordpress/zanim ponownie zmieniłem permalinki - wciąż nic.

Przeszedłem również do pliku .conf mojej witryny i zmieniłem try_files $uri $uri/ /index.php;na następujące, ponownie uruchamiając nginx i php5-fpm za każdym razem;

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

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

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

Korzystam z serwera domowego z nginx. Wszelkie pomysły na temat tego, co się tutaj dzieje?

ninjachicken1
źródło

Odpowiedzi:

13

Są to .htaccessreguły przepisywania Apache , ale stwierdziłeś, że jesteś na serwerze Nginx. Nginx nie używa .htaccesspliku na poziomie katalogu, a tym bardziej .htaccesssamego pliku. Musisz edytować samą konfigurację serwera. Kodeks zawiera szczegółową próbkę :

# 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
źródło
Dzięki, zagłosowałbym za tym, gdybym miał reputację. Mam trochę problemów z implementacją tego do mojego pliku .conf, ponieważ został on już znacznie zmieniony w stosunku do domyślnego, ale przynajmniej nie mam już więcej problemów z .htaccess.
ninjachicken1
@ s_ha_dum, używałem tej konfiguracji do wczoraj, kiedy zaktualizowałem do wordpress 4.8, a teraz dostaję 404s na niestandardowej strukturze permalinks ... próbowałem debugować od wczoraj, ale nic worx, jakieś pomysły?
Jadeye
Musiałem zmienić ostatni wiersz ot: „fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;” pracować nad Ubuntu 18.04, ale działa i uratował mi zdrowie psychiczne
Rob
18

Używam Wordpress Multisite z niestandardowym ustawieniem bezpośredniego łącza: /% category% /% postname% /

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

Na serwerze {

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

Jeśli Twoim głównym wordpress nie jest katalog główny, ale http://domain.com/wordpress/ :

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

Jeśli używasz starego wordpressa z blogs.dir, dodaj: location ^ ~ /blogs.dir {internal; alias /var/www/wordpress/wp-content/blogs.dir; access_log off; log_not_found off; wygasa max; }

Sprawdź konfigurację nginx: sudo nginx -t

Przeładuj nginx: usługa sudo przeładuj nginx

Spróbuj także zmienić ustawienia łącza bezpośredniego.

Domi
źródło
4
To najlepsza odpowiedź dla każdego, kto chce ręcznie przenieść instalację WordPress do podkatalogu pod nową nazwą domeny! DZIĘKUJĘ BARDZO! To powinna być zaakceptowana odpowiedź.
specialk1st
1
Ścieżka: / etc / nginx / site-available / powinna brzmieć: / etc / nginx / sites-available /
Grant
6

Musiałem dodać ten fragment kodu zarówno do, jak /sites-available/your-settings-filei /sites-enabled/your-settings-file:

server {
[...]

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

[...]
}

Teraz działa dla mnie.

Angelo Reale
źródło
1
To prosta odpowiedź, której szukałem, dzięki
ThEBiShOp
1
To zadziałało! Czy możesz wyjaśnić, co to robi? (zwłaszcza „ostatnia” część ...)
Sidd,
1

Musiałem ustawić ścieżkę katalogu głównego do zainstalowanego katalogu wordpressś: root / var / www / html / wp;

Nie podoba mi się to, ponieważ mam więcej aplikacji zainstalowanych na tym komputerze, ale tworzenie większej liczby wirtualnych hostów powinno wystarczyć.

Mendas
źródło