On Nginx WordPress Permalinks we came across an issue where all links in a WP/Osclass site throws 404 error. This is a typical behaviour of WP/Osclass permalinks configuration issue.
The first step is to confirm it is a Nginx WordPress permalinks issue.
The configuration file for Nginx is /etc/nginx/nginx.conf and it specified the log file for Nginx as /var/log/nginx/error.log
The error log contained the following information
2014/02/03 06:17:04 [error] 18596#0: *1538 "/home/user/public_html/demo/index.php" is not found (2: No such file or directory), client: xx.xx.xx.xx, server: www.domain.com, request: xxxxxx/xxxx/xx " host: "domain.com/demo"
The folder “demo” was missing in the document root.
The .htaccess file had the following entries for WP permalink activation
<IfModule mod_rewrite> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Hower Nginx won’t accept .htaccess file and the permalinks specified in the file will not applied. Hence custom redirect rules are to be added in the Nginx configuration file.
Let us have detailed look into the configuration file. The Virtual host entry configuration details specified in /etc/nginx/nginx.conf are given below
# Virtual Host Configs include /etc/nginx/conf.d/*.conf; include /opt/pifpm/sites-enabled/*.conf; include /opt/pifpm/sites-proxied/*.conf;
As mentioned in the above entries the active virtual host entries are stored in the location /opt/pifpm/sites-enabled/
root@hostname[/opt/pifpm/sites-enabled]# ls -l total 40 drwxr-xr-x. 2 root root 4096 Feb 3 06:26 ./ drwxr-xr-x. 17 root root 4096 Jan 15 03:43 ../ -rw-r--r--. 1 root root 2202 Jan 10 17:09 forum.domain1.pl.conf -rw-r--r--. 1 root root 2140 Jan 7 00:12 domain2.pl.conf -rw-r--r--. 1 root root 2458 Jan 10 17:09 domain3.pl.conf
The domain in question is domain1.pl, hence the configuration is domain1..pl.conf . Let us have a look into it. The most relevant entries are given below
server { listen xx.xx.xx.xx:80; ## listen for ipv4; root /home/user/public_html/demo; include /opt/pifpm/nginx.include.d/demo.domain1.pl.indexprio; access_log /usr/local/apache/domlogs/demo.domain1.pl; # Server name and its aliases server_name www.demo.domain1.pl demo.domain1.pl; include /opt/pifpm/nginx.include.d/demo.domain1.pl.autoinclude; location / {include /opt/pifpm/nginx.include.d/demo.domain1.pl.include;} ##Additional_locations
As you can see from the configuration, it contains the IP, DocumentRoot, access_log location ,server name etc.
The permalink redirect rule for Nginx is given below
try_files $uri $uri/ /index.php?q=$uri&$args;
Add this to the location directive include file ie /opt/pifpm/nginx.include.d/demo.domain1.pl.include
Once this is done, restart Nginx
/etc/init.d/nginx restart
If you receive the following error
# /etc/init.d/nginx restart nginx: [emerg] "try_files" directive is duplicate in /opt/pifpm/nginx.include.d/demo.domain1.pl.include:1 nginx: configuration file /etc/nginx/nginx.conf test failed
It could be an issue with the directive. In such case, you need to provide complete directive in the include file as given below
location / {try_files $uri $uri/ /index.php?$args;}
Once this is done, restart the webserver
[~]# /etc/init.d/nginx restart
You can safely ignore the warnings and can proceed with the check. In my case, it worked like a charm