gbalduzzi
gbalduzzi

Reputation: 10176

Nginx configuration to only forward request to php laravel server for files with prefix

I have a kubernetes deployment of a laravel app with two containers:

It works perfectly with the following nginx configuration:

server {
        listen 80;
        root /var/www/public;

        index index.html index.htm index.php;
        charset utf-8;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        error_page 404 /index.php;

        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            include fastcgi_params;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|eot|ttf|woff|woff2)$ {
            expires 2d;
            add_header Cache-Control "public, no-transform";
        }
    }

Here comes the problem: I need to return some encrypted files that should be handled by laravel (to handle authorization, autentication and decryption). Those files are requested using the following endpoint:

example.com/files/decrypt/path/to/file.jpg?token=tokentovalidaterequest

Such a request generates a nginx error and 404 response (from the nginx logs, I replaced the requested path with $path):

2021/10/28 08:29:22 [error] 24#24: *1 open() "/var/www/public/files/decrypt/$path" failed (2: No such file or directory), client: 10.244.0.97, server: , request: "GET /files/decrypt/files/decrypt/$path?hash=$hash HTTP/1.1", host: "example.com"
10.244.0.97 - - [28/Oct/2021:08:29:22 +0000] "GET /files/decrypt/$path?hash=$hash HTTP/1.1" 404 6622 "https://example.com" "user-agent" "ip"

The request is actually handled by php due to:

error_page 404 /index.php;

But it loses the querystring parameter and I don't want my nginx logs to be full of fake errors.

Is there a way to tell nginx "if the location starts with /files, send the request directly to php without checking if the file exists on the filesystem"?

I tried adding:

location /files {
    try_files /index.php?$query_string;
}

before the location / block, but I obtained a nginx configuration error

What is the proper way to achieve this?

Upvotes: 1

Views: 757

Answers (1)

Richard Smith
Richard Smith

Reputation: 49722

The try_files statement requires at least two parameters, see this document. You can add a fake filename as the first parameter.

For example:

try_files nonexistent /index.php?$query_string;

Alternatively, a rewrite statement would work too, and note that rewrite will automatically append the query string, see this document.

For example:

rewrite ^ /index.php last;

Upvotes: 1

Related Questions