Multi Site WordPress rewrite rules in Nginx

I’m trying to run a multi domain blog installation with WordPress and Nginx. The last step is to configure some rewrite rules in .htaccess (apache only) for the webserver. How do I translate this into Nginx rewrite rules?

RewriteEngine On
RewriteBase /

RewriteRule ^index.php$ - [L]

# uploaded files
RewriteRule ^files/(.+) wp-includes/ms-files.php?file=$1 [L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]

Related posts

Leave a Reply

4 comments

  1. nginx rewrite rules example for WordPress 3 :

    server{
        server_name *.example.com;  
        listen 80;
        #on server block
        ##necessary if using a multi-site plugin
        server_name_in_redirect off;
        ##necessary if running Nginx behind a reverse-proxy
        port_in_redirect off;
        access_log /var/log/nginx/example-com-access.log;
    
        location / {
            root   /var/www/example.com/wordpress;
            index  index.html index.htm index.php;
            rewrite ^.*/files/(.*)$ /wp-includes/ms-files.php?file=$1 last;
            if (!-e $request_filename) {
                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 /var/www/example.com/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 ~ wp-.*.php|wp-admin|.php$ {
            include /etc/nginx/fastcgi_params;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/example.com/wordpress$fastcgi_script_name;
        }
    }
    
  2. This nginx rewrite rules for WordPress have solved my problem perfectly,including changing ex.com/wp-admin to ex.com/wp-admin/.

    But i’ve found a bug inside which wasted me several hours as follows:
    If the static url include .html just like /%category%/%post_id%.html,you have to insted of:

    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 /var/www/example.com/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;
        }

    Change it to:

    location ~* ^.+.(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 /var/www/example.com/wordpress;
            rewrite ^/.*(/wp-.*/.*.(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/(.*(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;
        }

    Or,u’ll had ‘404 page not found’ error in the content pages!