Nginx重写规则,fastcgi和WordPress – 404页面是由于REQUEST_URI吗?

我试图转换为Apache创build的一组重写规则,用于托pipe与NginX(fastcgi,PHP)一起使用的WordPress站点。

据我所知,WordPress有一个页面(“ expo ”),然后使用主题中的代码来检查请求参数(“ p ”)。 然后它使用“ p ”来执行一些数据库查询和呈现内容。

所以你可以通过调用/expo?p=name_of_expo访问这个页面。

要求是URL的结构如下: /expo/name_of_expo

我已经把它剥离到我可以做的最基本的重写规则:

 location ~ ^/expo/.+/?$ { rewrite ^/(.+)/(.+)/?$ /$1/?p=$2? last; try_files $uri $uri/ /index.php?$args; } location / { index index.php; try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } 

进入/expo?p=name_of_expo ,显示正确的页面。 但是,当去/expo/name_of_expo ,WordPress 404被触发。

来自nginx的重写日志表明正在编写正确的URL:

 2012/03/08 16:56:16 [notice] 15995#0: *7698 "^/(.+)/(.+)/?$" matches "/expo/name_of_expo", client: 192.168.60.116 [snip...] 2012/03/08 16:56:16 [notice] 15995#0: *7698 rewritten data: "/expo/", args: "p=name_of_expo", client: 192.168.60.116 [snip...] 

必要的软件版本信息:

 nginx version: nginx/1.0.13 spawn-fcgi v1.6.3 (ipv6) - spawns FastCGI processes Build-Date: May 25 2010 12:33:48 PHP 5.2.10 (cli) (built: Nov 13 2009 11:44:05) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies CentOS release 5.7 (Final) 

尝试这个

 server { error_page 405 = @handler; error_page 404 = @handler; location / { if (-f $request_filename) { break; } if (!-e $request_filename) { rewrite . /index.php last; } } location @handler { rewrite / /index.php; } location ~ \.php/ { rewrite ^(.*.php)/ $1 last; } location ~ \.php$ { if (!-e $request_filename) { rewrite / /index.php last; } fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 

并在你的fastcgi_params

 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 SCRIPT_NAME $fastcgi_script_name; 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; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;