Hmm, so this had greatly frustrated me a few weeks ago, to the point I gave up and just let it stew on the backburner, hoping someone would blog about a solution.
As it turns out I did have the correct Nginx rewrite rules for Wordpress; what I didn't have originally was some of the necessary fastcgi parameters to make PHP work correctly (PHP pages were rendering so I figured everything was in order).
So if you're looking to move your Wordpress install to Nginx, just make sure you've got the following in your PHP section:
fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; 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 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; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/yoursite.com$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length;
And then add the following to handle Wordpress's pretty urls:
location /blog/ { index index.php; if (-e $request_filename) { break; } rewrite ^/blog/(.+)$ /blog/index.php?q=$1 last; }
Not all of the fastcgi_params may be necessary; I saw a guy's config and realized I didn't have all of them so pasted a few more in.
One issue that hung me up forever was that of setting the document root. In one of my virtual host sections I chose to define it within the location / block. I didn't define it within the location /blog/ block and this produced some hard-to-debug errors (everything was making it through the !-e test). So make sure to put a top-level root declaration in your server { } block.
In addition to the above configuration for Wordpress, you can also use this one:
location /blog/ { index index.php index.html; if (!-e $request_filename) { rewrite ^/blog/(.+)$ /blog/index.php?q=$1 last; } }