How to configure Nginx for WordPress permalinks

Posted on in Categories , , , , , , , last updated February 4, 2017

I switched from Apache to Nginx web server. How do I configure permalinks under WordPress blog?

WordPress has the ability capacity to create a custom URL structure for your blog posts and archives. There are three basic types of WordPress permalinks:

  • Ugly: https://www.cyberciti.biz/faq/?p=2284
  • Pretty using mod_rewrite: https://www.cyberciti.biz/faq/bash-for-loop/
  • Almost pretty using PHP PATHINFO: https://www.cyberciti.biz/faq/index.php/bash-for-loop/

In the Settings ? Permalinks panel, you can choose one of the more common permalink structures as follows:

Fig.01: WordPress permalinks: Choosing your permalink structure
Fig.01: WordPress permalinks: Choosing your permalink structure

How do I use “Pretty” permalinks with Nginx?

Edit your nginx.conf file, run:
$ sudo vi /etc/nginx/site-enabled/cyberciti.biz.conf
Edit/add/append the following location block within the server block:

location / {
            try_files $uri $uri/ /index.php?$args; 
}

If your WordPress blog is in /faq/ sub-directory, try:

location /faq/ {
            try_files $uri $uri/ /faq/index.php?$args; 
}

Save and close the file. Restart/reload your nginx server, run:
$ sudo systemctl reload nginx
OR
$ sudo /usr/sbin/nginx -s reload
Here is my sample config file:

# Upstream to abstract backend connection(s) for PHP.
upstream php {
  server unix:/run/php/php7.0-fpm.sock;
}
server {
    server_name www.cyberciti.biz;
    root        /var/www/html;
 
    location /faq/ {
         try_files $uri $uri/ /faq/index.php?$args;
    }
 
    #Add trailing slash to */wp-admin requests.
    rewrite /faq/wp-admin$ $scheme://$host$uri/ permanent;
 
    # Directives to send expires headers and turn off 404 error logging.
    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
       access_log off; log_not_found off; expires max;
    }
 
# Pass all .php files onto a php-fpm/php-fcgi server.
    index index.php;
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
                return 404;
    }
# This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default)
    include /etc/nginx/fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
 }
}

1 comment

  1. Greetings
    I’m struggling with a similar problem, and wasn’t able to make it relative: it’s working if the installation is at the root, but not if it’s inside a folder, unless you specify a path explicitly. It seems to be a case where Apache is still more flexible.

Leave a Comment