If you opt to set up your own WordPress server and happen to choose Nginx as your web server, you will bump into this classic problem the moment you change the WordPress link to anything other than plain.
Luckily the solution is very simple, and you need only one line of change in your website’s Nginx configuration file.
1. Solution
Use your favorite editor to open your website’s Nginx server. The path is very likely to be the following if you use yum/opt-get to install it by default. If you do not have access to this file, you’ll need to contact your Linux server administrator to make a change for you.
vim /etc/nginx/sites-available/yourdomain.conf
Find the following line. This is the line that gave you the HTTP 404 error.
location / {
try_files $uri $uri/ =404;
}
Change this line to the following.
location / {
try_files $uri $uri/ /index.php?$args;
}
In order to enable the new configuration, you’ll need to restart the Nginx server.
sudo systemctl restart nginx
2. Reasons behind a few Whys
If you have opted to deploy WordPress along with Nginx, you might be interested in the reasons behind it.
2.1 Why does Plain Link Work for Nginx?
If you take a close look at the difference between a plain link and other structures, the plain link comes with a ‘?’ symbol. The question mark ‘?’ tells the webserver whatever comes after it is a parameter. The Nginx can understand it, and treat parameter p with a value of 123, and redirect the request to index.php for further processing.
2.2 Why is Apache Server Okay with Non-plain Pamerlink?
For other permalink types, their structure looks like a directory. Nginx knows it’s a directory, and the location block for / (web root directory) tries the first two directories ($URI and $URI/) without any success. So it comes to the 404 redirection and outputs the 404 page.
Unlike Nginx, Apache servers support .htaccess
files (or “distributed configuration files“). It provides a way to make configuration changes on a per-directory basis. When we installed WordPress, the WordPress software detected that your web server was Apache and generated a.htaccess
file under its own directory. So the WordPress software has full authority of .htaccess
, and writes the necessary configuration inside it to let Apache knows what comes after is not a directory, but parameters for index.php.
The Nginx server chooses not to support such distributed configuration for various reasons. It limits the configuration to Nginx itself, not the web application. As a result, the WordPress software won’t be able to do anything when non-plain permalinks are configured. Thus, you or your Linux administrator need to manually change it.
2.3 What did we just change?
What we added in the Nginx configuration file, effectively tells Nginx that you may try the directories first, but if they do not work, continue to try to make $URI a parameter and send it over to index.php. Voilà! Everything starts work.
3. Further readings
If you would like to learn more, I recommend you continue to read Create Nginx Rewrite Rule on Nginx official blog and official WordPress Nginx document.
If you have more questions, welcome to leave me a comment below.