搞不清楚 nginx 的配置问题

搞不清楚 nginx 的配置问题

我想使用 nginx 为 wordpress 3 多站点提供服务,这是我的 nginx 配置

server {
    listen 80;
    server_name lc.wp.com;
    index index.html;
    access_log /usr/local/var/log/nginx/lc.wp.access.log;
    error_log /usr/local/var/log/nginx/lc.wp.error.log debug;

    location / {
        root /usr/local/www/playground/php/wordpress/;
        autoindex on;
        index  index.html index.htm index.php;
        rewrite ^.*/files/(.*)$ /wp-includes/ms-files.php?file=$1 last;
        try_files $uri $uri/ @rewrite;
    }

    location @rewrite {
        rewrite ^.+?(/wp-.*) $1 last;
        rewrite ^.+/?(/.*\.php)$ $1 last;
        rewrite ^(.+)$ /index.php?q=$1 last;
    }

    location ~* ^.+\.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$
    {
        root /usr/local/www/playground/php/wordpress/;
        rewrite ^/.*(/wp-.*/.*\.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js))$ $1 last;
        rewrite ^.*/files/(.*(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js))$/wp-includes/ms-files.php?file=$1 last;
        expires 30d;
        break;
    }

    location ~ \.php {
        root /usr/local/www/playground/php/wordpress/;
        include /usr/local/etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }

我创建了一个子站点“sub1”,然后发生了奇妙的事情:

如果我访问以下网址,它可以正常工作

lc.wp.com/sub1/
lc.wp.com/sub1/hello/2011/06/16

如果我访问

lc.wp.com/sub1/wp-admin/post-new.php?post_type=post

服务器告诉我 404 未找到

curl -I http://lc.wp.com/sub1/wp-admin/post-new.php\?post_type\=post
HTTP/1.1 404 Not Found
Server: nginx/1.0.2
Date: Thu, 16 Jun 2011 10:25:11 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.3.5

如果我禁用 php 解析(注释 php 部分),并设置

rewrite ^.+?(/wp-.*) $1 redirect;

服务器302正常运行,并告诉我保存post-new.php文件。

现在有点疯狂了。T_T

答案1

你发的内容确实很乱。Nginx 按照特定顺序处理位置指令,并且只匹配一个(除非重写)。 停止标记一段时间,擦除你所拥有的,然后尝试这个:

server {
    listen       80;
    server_name  lc.wp.com;
    index index.php index.html;
    access_log /usr/local/var/log/nginx/lc.wp.access.log;
    error_log /usr/local/var/log/nginx/lc.wp.error.log debug;

    root /usr/local/www/playground/php/wordpress/;

    location / {
        try_files $uri $uri/ @wordpress;
    }

    location @wordpress {
        rewrite ^/([_0-9a-zA-Z-]+/)?files/(.+) /wp-includes/ms-files.php?file=$2 last;
        rewrite ^/([_0-9a-zA-Z-]+/)?wp-admin$ /$1wp-admin/ permanent;
        rewrite ^/[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) /$1 last;
        rewrite ^/[_0-9a-zA-Z-]+/(.*\.php)?$ /$1 last;
        rewrite .* /index.php last;
    }

    location ~ \.php$ {
        if (!-e $request_filename) {
            rewrite ^/[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) /$1 last;
            rewrite ^/[_0-9a-zA-Z-]+/(.*\.php)?$ /$1 last;
            rewrite .* /index.php last;
            return 404;
        }
        fastcgi_index index.php;
        fastcgi_intercept_errors on;
        fastcgi_split_path_info ^(.+\.php)(.*)$;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass 127.0.0.1:9000;

        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;
    }
}

相关内容