Nginx 为 WordPress 的 /wp-admin/ root 提供 404 错误

Nginx giving 404 error for WordPress' /wp-admin/ root

我在 WordPress - mysite 旁边有一个 Symfony2 应用程序 运行。com/blog 路由到我的 /var/www/mysite/wordpress/ 目录,其他所有路由到 /var/www/mysite/symfony:

server {
    listen 80;
    server_name mysite.com

    location / {
        try_files $uri /app.php$is_args$args;
    }

    location ~ ^/app\.php(/|$) {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        internal;
    }

    location /blog {
        root /var/www/mysite/wordpress;
        rewrite ^/blog/(.+)$ / break;
        try_files $uri $uri/ /blog/index.php?q=$uri&$args;
        index index.php;

        location ~ \.php {
            fastcgi_pass 127.0.0.1:9000;
            include fastcgi_params;
            fastcgi_split_path_info ^(?:\/blog)(.+\.php)(.*);
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}

一切正常,除了 WordPress 管理员 (mysite.com/blog/wp-admin/) 给我一个 404 错误。访问 mysite.com/blog/wp-admin/index.php 按预期工作,所以看起来 index index.php 行没有工作。这可能是什么问题?

您需要编辑 nginx 服务器配置。

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

这里有更多相关信息: http://codex.wordpress.org/Nginx#General_WordPress_rules

您应该使用 alias 而不是 root 指令:

location ^~ /blog {
    alias /var/www/mysite/wordpress;
    index index.php;

    try_files $uri $uri/ /blog/index.php?q=$uri&$args;

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_split_path_info ^(?:\/blog)(.+\.php)(.*);
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

因此,如果您声称 /blog/wp-admin/index.php 有效,但 /blog/wp-admin/ 无效,也许只是有条件地附加 index.php,如果需要的话?

+    rewrite ^/blog/wp-admin(/)?$ /wp-admin/index.php break;
     rewrite ^/blog/(.+)$ / break;

那么,关于您的 404,日志是怎么说的?我认为这可能与 index 指令导致 "an internal redirect" 的事实有关,因此如果您的 404 最终是通过 / 而不是生成的,我不会感到惊讶/blog location.