nginx – Redirect Causes 404 Error on Nginx

nginxredirectrewrite

How do I redirect if a user tries to direct access image files in browser only? I want to still keep the ability to allow social media sites to embed our images by hotlinking. I just want only if a user direct access image by browser to redirect.

This is my nginx conf

proxy_cache_path /var/www/img.example.com/htdocs/cache-store levels=1:2 keys_zone=pixstore:10m max_size=5g inactive=7d use_temp_path=off;
server {

    server_name img.example.com www.img.example.com;

    access_log /var/log/nginx/img.example.com.access.log ;
    error_log /var/log/nginx/img.example.com.error.log;

    add_header X-Proxy-Cache $upstream_cache_status;
    location / {
        proxy_cache pixstore;
        proxy_cache_revalidate on;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_lock on;
        add_header X-Cache-Status $upstream_cache_status;
        proxy_pass http://xxx.xxx.xxx.xxx:8090;
        proxy_redirect off;
        include proxy_params;
        proxy_cache_valid 200 7d;
        proxy_cache_valid 404 5m;
    }

    location ~ "^/c/600x1200_90_webp/img-master/img/\d+/\d+/\d+/\d+/\d+/\d+/((?<filenum>\d+)[^/]+\.(jpg|png|webp))$" {
    valid_referers server_names;
    if ($invalid_referer = "0") {
    return 301 http://view.example.com/artwork/$filenum; }
    }

}

nginx error log

2022/01/19 12:09:23 [error] 7426#7426: *30 open() "/usr/share/nginx/html/c/600x1200_90_webp/img-master/img/2021/06/09/00/00/05/90423484_p0_master1200.jpg" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: img.example.com, request: "GET /c/600x1200_90_webp/img-master/img/2021/06/09/00/00/05/90423484_p0_master1200.jpg HTTP/1.1", host: "img.example.com"

The redirect isn't working but it gives me a 404 error if I try to access any image files. I setup this as a reverse proxy site so I didn't define a root path. How can I fix this?

Best Answer

As you didn't define a root path for image location nginx uses the default one - /usr/share/nginx/html/. If you want these files to be fetched with proxy_pass you need to copy the configuration for proxy_pass to this location too.