![](/img/trans.png)
[英]How do I rewrite URLs with Nginx admin / Apache / Wordpress
[英]How do I rewrite URLs in a proxy response in NGINX
我習慣於將 Apache 與 mod_proxy_html 一起使用,並且正在嘗試使用 NGINX 實現類似的功能。 具體用例是,我在根上下文服務器上的端口 8080 上有一個在 Tomcat 中運行的管理 UI:
http://localhost:8080/
我需要在端口 80 上顯示它,但是我在此主機上運行的 NGINX 服務器上還有其他上下文,因此想嘗試訪問它:
http://localhost:80/admin/
我希望以下超級簡單的服務器塊可以做到這一點,但事實並非如此:
server {
listen 80;
server_name screenly.local.akana.com;
location /admin/ {
proxy_pass http://localhost:8080/;
}
}
問題是返回的內容 (html) 包含所有在根上下文中訪問的腳本和樣式信息的 URL,因此我需要重寫這些 URL 以從 /admin/ 而不是 / 開始。
我如何在 NGINX 中做到這一點?
我們應該首先仔細完整地閱讀有關proxy_pass 的文檔。
傳遞給上游服務器的 URI 是根據“proxy_pass”指令是否與 URI 一起使用來確定的。 proxy_pass 指令中的尾部斜杠表示 URI 存在且等於/
。 沒有尾部斜杠意味着沒有帽子 URI。
帶有 URI 的 Proxy_pass :
location /some_dir/ {
proxy_pass http://some_server/;
}
有了上面的,有以下代理:
http:// your_server/some_dir/ some_subdir/some_file ->
http:// some_server/ some_subdir/some_file
基本上, /some_dir/
被替換/
改變從請求路徑/some_dir/some_subdir/some_file
到/some_subdir/some_file
。
沒有 URI 的 Proxy_pass :
location /some_dir/ {
proxy_pass http://some_server;
}
使用第二個(沒有尾部斜杠):代理是這樣的:
http:// your_server /some_dir/some_subdir/some_file ->
http:// some_server /some_dir/some_subdir/some_file
基本上,完整的原始請求路徑無需更改即可傳遞。
因此,在您的情況下,您似乎應該刪除尾部斜杠以獲得所需的內容。
警告
請注意,只有在 proxy_pass 中不使用變量時,自動重寫才有效。 如果你使用變量,你應該自己重寫:
location /some_dir/ {
rewrite /some_dir/(.*) /$1 break;
proxy_pass $upstream_server;
}
還有其他一些重寫不起作用的情況,這就是為什么必須閱讀文檔的原因。
再次閱讀您的問題,似乎我可能錯過了您只想編輯 html 輸出。
為此,您可以使用sub_filter指令。 就像是 ...
location /admin/ {
proxy_pass http://localhost:8080/;
sub_filter "http://your_server/" "http://your_server/admin/";
sub_filter_once off;
}
基本上,您要替換的字符串和替換字符串
您可能還需要在具有數據壓縮的后端服務器的第一個“sub_filter”之前設置以下指令:
proxy_set_header Accept-Encoding "";
否則它可能無法工作。 對於您的示例,它將如下所示:
location /admin/ {
proxy_pass http://localhost:8080/;
proxy_set_header Accept-Encoding "";
sub_filter "http://your_server/" "http://your_server/admin/";
sub_filter_once off;
}
您可以使用以下 nginx 配置示例:
upstream adminhost {
server adminhostname:8080;
}
server {
listen 80;
location ~ ^/admin/(.*)$ {
proxy_pass http://adminhost/$1$is_args$args;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
如果沒有需要用sub_filter重寫的超鏈接,你可以只使用proxy_redirect
指令:
location /admin/ {
proxy_pass http://localhost:8080/;
proxy_redirect / /admin/
}
它根據給定的“匹配重寫”規則更改響應的 Location-Header。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.