pythonnginxnginx-locationnginx-reverse-proxypypiserver

Nginx reverse proxy fails if location is not `/` with pypiserver


I'm trying to get a custom PyPI server running using pypiserver.

I tried to modify the example nginx.conf file in the README in order to use /mylocation instead of / and ended up with the following:

server {
    server_name mypi.com;
    listen 443 ssl;
    ssl_certificate /cert/path;
    ssl_certificate_key /key/path;
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location /mylocation {
        auth_basic            "Howdy!";
        auth_basic_user_file  /path/to/pwd;

        proxy_set_header    Host $host:$server_port;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_pass        127.0.0.1:8080/;
    }
}

If I connect directly (via browser) to http://mypi.com:8080, the default welcome page of pypiserver pops up. If I try instead to connecto to https://mypi.com/mylocation it redirects me to https://mypi.com/simple/ and throws a 404 error. I thought that the combination of location + proxy_pass was basically a way of saying "Connecting to mypi.com/mylocation is the same as mypi.com:8080/". Did I get this wrong? Or is the problem related to pypiserver itself?

If it helps, I'm on a Raspberry Pi with the following programs' versions:


Solution

  • A location block with proxy_pass just passes through the path unchanged unless you rewrite it.

    For your case add the following rewrite rule after the proxy_pass statement.

    rewrite ^/mylocation/?(.*)$ /$1 break;