Mengubah permalinks memberi saya 404 kesalahan pada nginx

18

EDIT

Ternyata saya menggonggong pohon yang salah mencoba mengedit .htaccess, karena nginx tidak menggunakannya. Apa yang tampaknya perlu saya lakukan adalah mengedit file .conf saya. Sebelum saya membaca ini, my_app.conf tampak seperti ini:

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

Sekarang terlihat seperti ini, dan itu masih tidak berfungsi:

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

Adakah yang tahu apa yang saya lakukan salah?

AKHIR EDIT

Saya telah mengubah permalink saya dari default menjadi /% postname% /, dan sekarang tautan dalam panel Admin WordPress memberi saya 404 kesalahan - Bukan WordPress 404 halaman, nginx 404 halaman. Mencari tahu mengapa ini mengatakan kepada saya bahwa ini harus mengedit file .htaccess saya atau memberi tahu saya WordPress tidak dapat menulis ulang .htaccess - file .htaccess tidak ada, dan WordPress tidak memberikan kesalahan ketika saya mengubah permalinks.

Saya sudah mencoba membuat file .htaccess kosong di folder wordpress saya, memberikannya 666 izin, mengubah pengguna dan grup menjadi www-data dan kemudian mengubah permalinks- yang tidak berfungsi. Saya kemudian mengubahnya menjadi ini sebelum mengubah permalink:

# 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

Ketika itu tidak bekerja, saya berubah RewriteBaseuntuk /wordpress/sebelum mengubah permalinks lagi - masih ada.

Saya juga masuk ke file .conf situs saya dan berubah try_files $uri $uri/ /index.php;menjadi yang berikut, memulai kembali nginx dan php5-fpm setiap kali;

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

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

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

Saya menjalankan server rumah dengan nginx. Ada ide tentang apa yang terjadi di sini?

ninjachicken1
sumber

Jawaban:

13

Itu adalah .htaccessaturan penulisan ulang Apache , tetapi Anda telah menyatakan bahwa Anda menggunakan server Nginx. Nginx tidak menggunakan .htaccessfile level direktori-like, apalagi itu menggunakan .htaccessfile itu sendiri .. Anda perlu mengedit konfigurasi server itu sendiri. Codex memiliki sampel detail :

# 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
sumber
Terima kasih, saya akan memilih ini jika saya memiliki reputasi. Saya mengalami sedikit kesulitan menerapkan ini ke file .conf saya karena sudah berubah secara signifikan dari default, tapi setidaknya saya tidak bermain-main dengan .htaccess lagi.
ninjachicken1
@ s_ha_dum, saya menggunakan konfigurasi ini sampai kemarin ketika saya memperbarui ke wordpress 4.8 dan sekarang saya mendapatkan 404s pada struktur kustom permalinks .... mencoba men-debug sejak kemarin tapi tidak ada yang worx, ada ide ??
Jadeye
Saya harus mengubah baris terakhir atau membaca "fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;" untuk bekerja di Ubuntu 18.04 tetapi bekerja dan menyelamatkan kewarasan saya
Rob
18

Saya menggunakan multisite wordpress dengan pengaturan permalink kustom: /% kategori% /% postname% /

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

Di server {

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

Jika root wordpress Anda bukan webroot tetapi http://domain.com/wordpress/ :

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

Jika Anda menggunakan wordpress lama dengan blogs.dir, tambahkan: location ^ ~ /blogs.dir {internal; alias /var/www/wordpress/wp-content/blogs.dir; access_log off; log_not_found off; kedaluwarsa maks; }

Periksa konfigurasi nginx: sudo nginx -t

Reload nginx: sudo service nginx reload

Coba juga ubah pengaturan permalink.

Domi
sumber
4
Ini adalah jawaban terbaik bagi siapa saja yang ingin memindahkan instalasi WordPress secara manual ke subdirektori dengan nama domain baru! TERIMA KASIH BANYAK! Ini harus menjadi jawaban yang diterima.
spesialk1
1
Path: / etc / nginx / site-available / harus membaca: / etc / nginx / sites-available /
Grant
6

Harus menambahkan potongan kode ini untuk kedua /sites-available/your-settings-filedan /sites-enabled/your-settings-file:

server {
[...]

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

[...]
}

Ini bekerja untuk saya sekarang.

Angelo Reale
sumber
1
Ini adalah jawaban sederhana yang saya cari, terima kasih
ThEBiShOp
1
Ini berhasil! Bisakah Anda jelaskan apa fungsinya? (esp bagian "terakhir" ...)
Sidd
1

Saya harus mengatur path root ke direktori terinstal wordpressÅ›: root / var / www / html / wp;

Saya tidak suka karena saya memiliki lebih banyak aplikasi yang diinstal pada mesin ini tetapi membuat lebih banyak virtual host sudah cukup.

Mendas
sumber