Das Ändern von Permalinks gibt mir 404 Fehler auf Nginx

18

BEARBEITEN

Es stellte sich heraus, dass ich beim Versuch, .htaccess zu bearbeiten, den falschen Baum aufgebellt hatte, da Nginx ihn nicht verwendet. Was ich anscheinend tun muss, ist, meine .conf Akte zu redigieren. Bevor ich das las, sah meine_app.conf so aus:

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

Jetzt sieht es so aus und es funktioniert immer noch nicht:

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

Weiß jemand was ich falsch mache?

ENDE BEARBEITEN

Ich habe meine Permalinks von der Standardeinstellung in /% postname% / geändert, und jetzt zeigen die Links im Admin-Bereich von WordPress 404-Fehler an - keine WordPress 404-Seiten, keine Nginx 404-Seiten. Nachschlagen, warum mir dies gesagt wird, dass dies meine .htaccess-Datei bearbeiten soll oder dass WordPress .htaccess nicht umschreiben kann - die .htaccess-Datei ist nicht vorhanden, und WordPress gibt keine Fehler aus, wenn ich Permalinks ändere.

Ich habe versucht, eine leere .htaccess-Datei in meinem WordPress-Ordner zu erstellen, ihr 666-Berechtigungen zu erteilen, den Benutzer und die Gruppe in WWW-Daten zu ändern und dann die Permalinks zu ändern - das hat nicht funktioniert. Ich habe es dann geändert, bevor ich die Permalinks geändert habe:

# 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

Als das nicht funktionierte, habe ich zu gewechselt RewriteBase, /wordpress/bevor ich wieder die Permalinks geändert habe - immer noch nichts.

Ich habe auch in die .conf-Datei meiner Site gewechselt und try_files $uri $uri/ /index.php;folgende Änderungen vorgenommen , wobei ich jedes Mal nginx und php5-fpm neu gestartet habe.

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

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

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

Ich verwende einen Heimserver mit Nginx. Irgendwelche Ideen, was hier los ist?

ninjachicken1
quelle

Antworten:

13

Dies sind Apache- .htaccessUmschreiberegeln, aber Sie haben angegeben, dass Sie sich auf einem Nginx-Server befinden. Nginx verwendet keine .htaccessDatei auf Verzeichnisebene, geschweige denn die .htaccessDatei selbst. Sie müssen die Serverkonfiguration selbst bearbeiten. Der Codex enthält ein detailliertes Beispiel :

# 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
quelle
Danke, ich würde mich dafür aussprechen, wenn ich den Ruf hätte. Ich habe ein wenig Probleme, dies in meine .conf-Datei zu implementieren, da sie bereits erheblich von der Standarddatei geändert wurde, aber zumindest spiele ich nicht mehr mit .htaccess herum.
ninjachicken1
@s_ha_dum, ich habe diese Konfiguration bis gestern verwendet, als ich auf WordPress 4.8 aktualisiert habe. Jetzt erhalte ich 404-Werte für die benutzerdefinierte Struktur von Permalinks.
Jadeye
Ich musste die letzte Zeile ändern, um "fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;" zu lesen. auf Ubuntu 18.04 zu arbeiten, aber es funktioniert und meine geistige Gesundheit gerettet
Rob
18

Ich verwende WordPress Multisite mit benutzerdefinierten Permalink-Einstellungen: /% category% /% postname% /

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

Auf dem Server {

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

Wenn Ihr Root-WordPress nicht das Webroot ist, sondern http://domain.com/wordpress/ :

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

Wenn Sie altes WordPress mit blogs.dir verwenden, fügen Sie hinzu: location ^ ~ /blogs.dir {internal; alias /var/www/wordpress/wp-content/blogs.dir; access_log off; log_not_found off; Läuft maximal ab; }

Überprüfen Sie die Nginx-Konfiguration: sudo nginx -t

Nginx neu laden: sudo service nginx neu laden

Versuchen Sie auch, die Permalink-Einstellungen zu ändern.

Domi
quelle
4
Dies ist die beste Antwort für alle, die eine WordPress-Installation unter einem neuen Domainnamen manuell in ein Unterverzeichnis verschieben möchten! ICH DANKE DIR SEHR! Dies sollte die akzeptierte Antwort sein.
Specialk1st
1
Der Pfad: / etc / nginx / site-available / sollte lauten: / etc / nginx / sites-available /
Grant
6

Musste dieses Stück Code sowohl zu /sites-available/your-settings-fileund hinzufügen /sites-enabled/your-settings-file:

server {
[...]

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

[...]
}

Es funktioniert jetzt für mich.

Angelo Reale
quelle
1
Dies ist die einfache Antwort, die ich gesucht habe, danke
ThEBiShOp
1
Das hat funktioniert! Könnten Sie bitte erklären, was es tut? (vor allem der "letzte" Teil ...)
Sidd
1

Ich musste den Root-Pfad auf das installierte WordPress-Verzeichnis setzen: root / var / www / html / wp;

Ich mag es nicht, weil ich mehr Anwendungen auf diesem Computer installiert habe, aber das Erstellen weiterer virtueller Hosts sollte ausreichen.

Mendas
quelle