Why isn't this rewrite rule (nginx) applied? (trying to setup Wordpress multisite)
- by Brian Park
Hi, I'm trying to setup Wordpress multisite (subfolder structure) with nginx, but having a problem with this rewrite rule.
Below is the Apache's .htaccess, which I have to translate into nginx configuration.
RewriteEngine On
RewriteBase /blogs/
RewriteRule ^index\.php$ - [L]
# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
Below is what I came up with:
server {
listen 80;
server_name example.com;
server_name_in_redirect off;
expires 1d;
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
root /srv/www/example.com/public;
index index.html;
try_files $uri $uri/ /index.html;
# rewriting uploaded files
rewrite ^/blogs/(.+/)?files/(.+) /blogs/wp-includes/ms-files.php?file=$2 last;
# add a trailing slash to /wp-admin
rewrite ^/blogs/(.+/)?wp-admin$ /blogs/$1wp-admin/ permanent;
if (!-e $request_filename) {
rewrite ^/blogs/(.+/)?(wp-(content|admin|includes).*) /blogs/$2 last;
rewrite ^/blogs/(.+/)?(.*\.php)$ /blogs/$2 last;
}
location /blogs/ {
index index.php;
#try_files $uri $uri/ /blogs/index.php?q=$uri&$args;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public$fastcgi_script_name;
}
# static assets
location ~* ^.+\.(manifest)$ {
access_log /srv/www/example.com/logs/static.log;
}
location ~* ^.+\.(ico|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
# only set expires max IFF the file is a static file and exists
if (-f $request_filename) {
expires max;
access_log /srv/www/example.com/logs/static.log;
}
}
}
In the above code, I believe rewrite ^/blogs/(.+/)?(.*\.php)$ /blogs/$2 last; has no effect because when I look at the access_log file, I see the following line:
2010/09/15 01:14:55 [error] 10166#0: *8 "/srv/www/example.com/public/blogs/test/index.php" is not found (2: No such file or directory), request: "GET /blogs/test/ HTTP/1.1"
(Here, 'test' is the second blog created using multisite feature) What I'm expecting is that /blogs/test/index.php gets rewritten to /blogs/index.php, but it doesn't seem to do that...
Am I overlooking something obvious?
Thanks!