การเปลี่ยน Permalinks ทำให้ฉันมีข้อผิดพลาด 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;
    }
}

มีใครรู้บ้างว่าฉันทำผิดอะไร

สิ้นสุดการแก้ไข

ฉันได้เปลี่ยน Permalink ของฉันจากค่าเริ่มต้นเป็น /% postname% / และตอนนี้ลิงก์ภายในแผงการดูแลระบบของ WordPress ให้ข้อผิดพลาด 404 ถึงฉัน - ไม่ใช่ WordPress 404 หน้า, nginx 404 หน้า ค้นหาสาเหตุที่มีการบอกฉันว่าสิ่งนี้ควรแก้ไขไฟล์. htaccess ของฉันหรือบอกฉันว่า WordPress ไม่สามารถเขียนใหม่. htaccess ได้ - ไฟล์. htaccess นั้นไม่มีความยาวและ WordPress ไม่ได้ให้ข้อผิดพลาดใด ๆ

ฉันได้ลองสร้างไฟล์. htaccess เปล่าในโฟลเดอร์ wordpress ของฉันโดยให้สิทธิ์ 666 ครั้งเปลี่ยนผู้ใช้และกลุ่มเป็น www-data จากนั้นเปลี่ยน Permalinks- ที่ไม่ทำงาน จากนั้นฉันเปลี่ยนมันเป็นสิ่งนี้ก่อนที่จะเปลี่ยน Permalinks:

# 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/ก่อนเปลี่ยน Permalinks อีกครั้ง แต่ก็ยังไม่มีอะไร

ฉันได้เข้าไปยังไฟล์. config ของเว็บไซต์ของฉันและเปลี่ยน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ไฟล์ตัวเองน้อยมาก.. คุณต้องแก้ไขการกำหนดค่าเซิร์ฟเวอร์เอง Codex มีตัวอย่างรายละเอียด :

# 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 บนโครงสร้างที่กำหนดเอง permalinks .... พยายามแก้ไขมันตั้งแต่เมื่อวาน แต่ไม่มีอะไร worx ความคิดใด ๆ ??
Jadeye

ฉันต้องเปลี่ยนบรรทัดสุดท้าย ot อ่าน "fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;" ทำงานกับ Ubuntu 18.04 แต่ใช้งานได้และช่วยรักษาสติของฉันไว้
Rob

18

ฉันใช้ wordpress multisite ด้วยการตั้งค่าลิงก์แบบกำหนดเอง: /% 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;
}

หากคุณใช้เวิร์ดเพรสเก่ากับ blogs.dir ให้เพิ่ม: location ^ ~ /blogs.dir {internal; นามแฝง /var/www/wordpress/wp-content/blogs.dir; ปิดการเข้าถึง log_not_found off; หมดอายุสูงสุด }

ตรวจสอบการกำหนดค่า nginx: sudo nginx -t

โหลดซ้ำ nginx: sudo service nginx reload

ลองเปลี่ยนการตั้งค่า Permalink ด้วย


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;

ฉันไม่ชอบเพราะฉันมีแอปพลิเคชันเพิ่มเติมติดตั้งในเครื่องนี้ แต่การสร้างโฮสต์เสมือนควรเพียงพอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.