How to configure Nginx for WordPress permalinks

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:
  • Pretty using mod_rewrite:
  • Almost pretty using PHP PATHINFO:

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/
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
$ 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 {
    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;

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

Share this on (or read 2 comments/add one below):

2 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.

    Have a question? Post it on our forum!