我正在尝试通过subdomian到localhost / folder做一个基本的NGINX反向代理,并且很困惑让它重写我的资产和链接。
我的http://localhost:8080/myapp/就像一个超级按钮,但是通过NGINX +子域,它在子文件夹资产上失败了。
我相信我对NGINX的'rewrite'子句感到困惑。
如何重写去客户端浏览器以删除/ myapp /上下文的HTML?
server {
listen 443 ssl;
server_name app1.domain.com;
location / {
rewrite ^/myapp/(.*) /$1 break; # this line seems to do nothing
proxy_pass http://localhost:8080/myapp/;
}
}
我希望在不使用子文件夹/ myapp /的情况下重写我生成的HTML(通过https://app1.domain.com),因此,当请求资产时,可以找到它们而不是针对https://app1.domain.com/myapp/assets/的404。它应该只是https://app1.domain.com/assets/(如果我手动去那里,它们会起作用)
-谢谢。
答案 0 :(得分:1)
从Ivan的反馈中得出并最终确定我的解决方案为:
server {
listen 443 ssl;
server_name app1.domain.com;
location / {
sub_filter '/myapp/' '/'; # rewrites HTML strings to remove context
sub_filter_once off; # ensures it loops through the whole HTML (required)
proxy_pass http://localhost:8080/myapp/;
}
}
答案 1 :(得分:0)
作为nginx proxy_pass
文档states:
在某些情况下,无法确定请求URI中要替换的部分:
...
当使用rewrite指令在代理位置内更改URI时,该相同的配置将用于处理请求(中断):
location /name/ { rewrite /name/([^/]+) /users?name=$1 break; proxy_pass http://127.0.0.1; }
在这种情况下,伪指令中指定的URI将被忽略,并将更改后的完整请求URI传递到服务器。
因此,使用此配置块将/myapp/assets/some_asset
URI重写为/assets/some_asset
并使用break
标志后,nginx会忽略/myapp/
指令上的proxy_pass
后缀,并且将/assets/some_asset
请求传递给您的后端。无论多么奇怪,您需要使用以下重写规则:
rewrite ^(/myapp/.*)$ $1 break;
另一种(可能更好)的解决方案是使用两个location
块:
location / {
proxy_pass http://localhost:8080/myapp/;
}
location /myapp/ {
proxy_pass http://localhost:8080;
}