我想使用 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;
}
}