Nginx 在子目录中使用任意 URL 提供相同内容

Nginx 在子目录中使用任意 URL 提供相同内容

例如,我想从 /webapps/client 目录提供 example.com/public/anyUserName ,其中 anyUserName 是除路径分隔符之外的任意字符组合。因此,对 example.com/public/Alice 的查询和对 example.com/public/Bob 的查询将从同一目录提供。我应该能够请求诸如 example.com/public/Alice/css/bootstrap.css 或http://example.com/public/Alice/client.js 没有问题。基本上,我想删除 URL 中的用户名部分并从同一目录提供服务,但我需要在浏览器的 URL 中保留用户名。

我尝试过很多不同的配置调整,从位置中的正则表达式到这个怪物,但在每种情况下,我都会得到 404、500(日志显示这是重写或内部重定向循环)、每个资源上都是 200(但每个资源都是索引),或者每个资源上都是 200(但每个除了该索引为 404。

    location /public  {
            index collmanagerclient.html;
            alias /webapps/client;
            autoindex on;
            try_files $2/$3/$4/$5/$6 $2/$3/$4/$5/$6/ =404;
    }

这是我的 nginx 配置:

server {
listen 80;
server_name secure.example.me;
rewrite ^(.*) https://$server_name$1 permanent;

}
server {
listen 443;
server_name secure.example.me;

ssl on;
ssl_certificate /etc/nginx/ssl/ssl-unified.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp521r1;
root /webapps/client;

index collmanagerclient.html;
location = / {
    try_files $uri $uri/ =404;
}


location ~ /public/(?:[^/]+)/(?<filename>.+) {
 alias /webapps/client;

 rewrite ^ $filename last;
}


location /signup {
    index collmanagersignup.html;
    alias /webapps/signup;
    try_files $uri $uri/ =404;
}
location /api {
    #turn gzip off to avoid breaking the cpu

    gzip off;

    proxy_pass http://localhost:7801;
    proxy_buffering off;

    include /etc/nginx/proxy.conf;
}

}

谢谢,最近这段时间我一直被这件事逼疯了。

答案1

我认为您需要研究一下重写模块。Nginx Rewrite 模块

就像是:

位置/公共{重写^ /Foo最后;}

答案2

也许这个可以满足你的要求:

location ~ ^/public/(?:[^/]+)/(?<filename>.+)/?$ {
    alias /webapps/client;

    rewrite ^ $filename last;
}

然后,使用它来替换location = /块:

location / {
    try_files $uri $uri/ =404;
}

这里我们首先使用正则表达式来匹配像 /public/username/file_to_get.html 这样的 URI。

字符之间的第一部分/捕获用户名,并且将其存储在任何地方(?:修饰符)。

第二部分将实际想要的文件名捕获到$filename变量中。

然后我们只需将请求 URI 重写为捕获的文件名。

相关内容