How to configure Nginx for WordPress permalinks


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:


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

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;





Leave a Reply

Your email address will not be published. Required fields are marked *