无法弄清楚nginx的configuration问题

我想用nginx来服务wordpress 3多站点,这是我的nginx conf

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

我创build一个子网站“sub1”,那么惊人的事情发生:

如果我访问下面的url,它正常工作

 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没有find

 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 

如果我禁用PHPparsing(评论PHP部分),并设置

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

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

现在有点疯了 T_T

你发布的东西真的很混乱。 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; } }