我试图把一个反向代理放在一些内部Web服务之前。
Nginx的设置和正常工作来服务请求。 如果我只提供一个location /在我的conf文件中,它会成功加载该proxy_pass目标,即:
location / { proxy_pass https://internal.ip:port/; }
浏览到https:// public_proxy_address /完美加载内部资源。
但是,由于我有多个内部应用程序,我想通过nginx代理所有这些应用程序。 所以,在我的testing中,我已经改变了conf,如下所示:
location /app1 { proxy_pass https://internal.ip:port/; }
有了这个,我得到了主/默认的内部应用程序索引页面,但查看源显示我没有链接样式表,js或其他资源正在被重写。 因此页面的全部内容都无法加载。 在Apache中,我可能会写一个proxyhtmlurlmap ^/resource/ /app1/resource R 虽然我找不到在nginx中实现这一点的方法。
我也试过这个,无济于事:
location /app1 { rewrite /resource(.*?) /app1/resource$1 break; proxy_pass https://internal.ip:port/; }
如何让nginx正确地将目标位置(app1)预先加载到请求的资源url,以便加载?
我最终只是与子域的代理。 基本看起来像这样:
server { listen 443 ssl; ssl on; ssl_cert <cert>; ssl_key <key>; server_name appname1.public.com; location / { proxy_pass https://internalapp1.ip:port } } server { listen 443 ssl; ssl on; ssl_cert <cert>; ssl_key <key>; server_name appname2.public.com; location / { proxy_pass https://internalapp2.ip:port } }
这消除了需要任何直接的url或资源重写。
由于我没有足够的信用,所以我无法评论参赛作品,因此,我的答复是作为一个单独的条目。
我不知道为什么OP不同意,但我认为马丁Fjordval正确识别问题,并build议正确的事情。 我build议稍微修改一下他的代码片段。
location /app1/ { proxy_set_header Host $http_host/app1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; add_header Pragma "no-cache"; add_header Cache-Control "no-cache"; proxy_pass http://internal.ip:port/; sub_filter 'action="/' 'action="/app1/'; sub_filter 'href="/' 'href="/app1/'; sub_filter 'src="/' 'src="/app1/'; sub_filter_once off; }
因此,如果您确定所有以“/”开头的相关url都需要redirect,那么上述内容会将“/ app1 /”附加到所有url上,并在被引用时被“location / app1 /”块捕获。 然后,您可以查看页面源并确认重写正在发生。
你也可能需要整个或者至less是'proxy_set_header'shabang的一部分,尤其是'proxy_set_header Host $ http_host / app1'位。
您已在您的位置指定了一个绝对url,而不是网页的url和网页使用的所有资源。 您需要指定一个以该URL开头的正则expression式。 像这样的东西可能会奏效(我还没有testing过)
location ~ /app1(/.*) { proxy_pass https://internal.ip:port/; }
如果我正确地理解你的问题,听起来像问题是你的应用程序认为它被托pipe在根uri /而它实际上托pipe在/app1而没有被告知这一点。 Nginx通常不会修改你所期望的后端响应,但是这是可能的。
首先,您要检查您的应用程序中是否有configuration选项,您可以在其中定义根URI。 如果有,那么设置这是迄今为止最简单的解决scheme。
如果找不到任何东西,可以使用replace模块replaceHTML中的URL。 请注意,为了使其工作,您需要在后端禁用GZIP编码,以便nginx可以看到未压缩的HTML。
你的子filter可能是什么样子的一个例子
location /app1 { sub_filter '<a href="/resource/' '<a href="/app1/resource/'; sub_filter_once off; proxy_pass https://internal.ip:port/; }
我有同样的问题; 索引页面正在加载,但所有资源收到404。
我注意到,在我所在的位置: try_files $uri $uri/ =404; 这将为所有资源返回404。 只要删除它。
location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; <---- Comment out this line. # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }