Zak
Zak

Reputation: 940

Getting '404 Not Found Nginx' while trying to visit Wordpress post

I have a NodeJS app deployed in the root of my domain (example.com) and I'm struggling for the last 7 days to add a blog in a subdirectory (example.com/blog). Even though I have set it up but I think there is some issue with Nginx config as I can't access the blog posts (blog homepage is accessible). It is also worth mentioning that I CAN access the posts if I set Permalinks to Plain in Wordpress settings, which I don't want because of SEO.

If I look at error logs then I can see this:

2022/09/02 15:43:43 [error] 86838#86838: *6 "/var/www/html/example.com/blog/advantages-of-social-media-2/index.php" is not found (2: No such file or directory), client: 142.52.23.144, server: www.example.com, request: "GET /blog/advantages-of-social-media-2/ HTTP/1.1", host: "www.example.com", referrer: "https://www.example.com/blog/"

Wordpress installation is located in /var/www/html/example.com/blog but in the config I have not added /blog but I can still access the blog homepage. And if I add it, then I can't access it anymore.

I tried like a million different solutions but nothing seems to be working. Someone please help me out.

Here's the full Nginx config without the SSL statements:

server {

       server_name example.com;
       return 301 https://www.example.com$request_uri;    

}

server {

        server_name www.example.com;

        # NodeJS App
        location / {
                proxy_pass http://localhost:3000;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $http_cf_connecting_ip;
                proxy_set_header X-Forwarded-For $http_x_forwarded_for;
                proxy_cache_bypass $http_upgrade;
        }

        # Wordpress Blog
        location /blog {

                access_log /var/log/nginx/blog_access.log;
                error_log /var/log/nginx/blog_error.log;

                root /var/www/html/example.com;
                index index.php;

                # Add a trailing slash if missing
                if (!-f $request_filename) {
                        rewrite [^/]$ $uri/ permanent;
                }
                
                # try_files $uri $uri/ /index.php?$args;
                # try_files $uri $uri/ /blog/index.php?q=$uri&$args;
                try_files $uri $uri/ /blog/index.php?$args;

                location ~ \.php {
                        try_files $uri =404;
                        fastcgi_split_path_info ^(.+\.php)(/.+)$;

                        fastcgi_index index.php;
                        # Change this to your fpm socket
                        fastcgi_pass  unix:/var/run/php/php8.1-fpm.sock;

                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        fastcgi_param PATH_INFO $fastcgi_path_info;
                        include fastcgi_params;
                }

        }
}

Upvotes: 1

Views: 2508

Answers (1)

silver
silver

Reputation: 5311

Try this, dont just copy and paste this and try to understand what each block do

server {
    listen 443 ssl http2;
    server_name www.example.com example.com;
    
    #Addition Configs
    .
    .
    .
    .
    .
    
    error_log /var/www/html/example.com/error error;

    root /var/www/html/example.com;
    index  index.html index.php;

    location / {
        gzip_static on;
        error_page 418 = @cachemiss;
        .
        .
        .
    }

    location @cachemiss {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    ### DISABLE LOGGING ###
    location = /robots.txt { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }

    ### CACHES ###
    location ~* \.(jpg|jpeg|gif|css|png|js|ico|html|mp4)$ { access_log off; expires max; }
    location ~* \.(woff|svg|woff2|ttf|eot)$ { access_log off; log_not_found off; expires 30d; }
    location ~* \.(js)$ { access_log off; log_not_found off; expires 7d; }
    
    location /blog {
        try_files $uri $uri/ /blog/index.php?q=$uri&$args;
    }

    ### php block ###
    location ~ \.php?$ {
        fastcgi_cache phpcache; 
        fastcgi_cache_valid 200 30m;
        fastcgi_cache_methods GET HEAD; 
        
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_hide_header X-Powered-By;
        fastcgi_pass   127.0.0.1:9000;
    }
}

The most important part you have to configure is the php-block/fast-cgi location block which you should directly put under server block and outside the blog location

Then on your blog location just do a request to /blog/index.php like so;

try_files $uri $uri/ /blog/index.php?q=$uri&$args;

your directory structure should be;

/var/www/html/example.com - your root folder which should contains any app you want
/var/www/html/example.com/blog - contains your wordpress installation 

for fastcgi caching, you either remove this line fastcgi_cache phpcache; from php block,

or go to /etc/nginx/nginx.conf and configure fastcgi caching like below; the code below should be in http block

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=phpcache:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Upvotes: 2

Related Questions