![Nginx 在子目录中使用任意 URL 提供相同内容](https://linux22.com/image/638546/Nginx%20%E5%9C%A8%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E4%BD%BF%E7%94%A8%E4%BB%BB%E6%84%8F%20URL%20%E6%8F%90%E4%BE%9B%E7%9B%B8%E5%90%8C%E5%86%85%E5%AE%B9.png)
例如,我想从 /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
答案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 重写为捕获的文件名。