【问题标题】:Nginx forwarding to different app's different path using `#` symbolNginx 使用 `#` 符号转发到不同应用程序的不同路径
【发布时间】:2020-01-08 02:58:28
【问题描述】:

快速提问。我们有两个应用程序。端口30013002。我们的域名是www.domain.com。 一旦人们进入www.domain.com/pathname,我们想要拥有它,我们希望他们被重定向到另一个应用程序的特定路径。 怎么做?

我们已经在我的 nginx 中提出了这个问题

location /pathname/ {
        proxy_pass         http://127.0.0.1:3002/;
    }

它几乎可以工作。但是,我们在3002 下的应用程序在路径/#/pathname 上运行。 我们可以通过输入www.domain.com/pathname/#/pathname 来访问它。我们想通过输入www.domain.com/pathname来访问相同的链接。

如何缩短?我错过了什么?

【问题讨论】:

    标签: nginx url-rewriting path location


    【解决方案1】:

    (upd) 只需将/pathname 重定向到/pathname/#/pathname

    根据您的评论,您只想从/pathname 重定向到/pathname/#/pathname

    试试这些组合指令:

    • rewrite 附加 #fragment identifier
    • proxy_pass 反向代理到应用程序。

    例如:

    location /short_path_name/ {
      rewrite ^ /pathname/#/$uri permanent;
      break;        
    }
    location /pathname/ {
      proxy_pass         http://127.0.0.1:3002/;
    }
    

    并为您的应用使用www.domain.com/short_path_name/ 链接。

    很遗憾,nginx 看不到fragment identifier

    很遗憾,你不能。因为服务器永远不会从浏览器中获取 fragment identifier

    片段标识符的功能与 URI 的其余部分不同:它的处理完全是客户端的,没有 Web 服务器的参与

    命名有点意思,但历史悠久。见TBL (1997): Fragment Identifiers on URIs:

    URI 引用是您通过获取信息对象的 URI、添加“#”符号和片段标识符来构建的东西。 (最后一个术语是历史性的,所以尽量不要将其简化为识别片段)。

    解决方法

    有一些解决方法,例如将主题标签符号编码为%23,但我不确定这是你的方式。

    使用 nginx 处理请求参数

    注意:重写url,如果在rewrite指令末尾添加?,nginx可以保留请求参数。

    Nginx rewrite手册:

    如果替换字符串包含新的请求参数,则之前的请求参数会附加在它们之后。如果这是不希望的,在替换字符串的末尾放置一个问号可以避免附加它们,例如:

       rewrite ^/users/(.*)$ /show?user=$1? last;
    

    【讨论】:

    • 你的意思是 nginx 会忽略# 之后的所有内容?在这种情况下#/pathname?对我们来说,无论什么都行。因为目前的网址太长了
    • 我的意思是客户端(即浏览器)不会将 url 的剩余部分发送到网络服务器。
    • 如果我理解正确,我不需要浏览器发送它。我的想法是,如果有人在浏览器中输入www.domain.com/pathname,nginx 会看到路径是/pathname,并在幕后自动将用户重定向到www.domain.com/pathname/#/pathname。对不起,如果这听起来令人困惑
    • 啊哈,谢谢!你试过这样吗? proxy_pass http://127.0.0.1:3002/#/pathname;
    • 我们设法将其保留为 ``` location /pathname { rewrite /pathname/(.*) /$1 break; proxy_pass 127.0.0.1:3002/#;代理重定向关闭; proxy_set_header 主机 $host; } ``` 我们无法找到解决路径的方法。所以现在人们可以通过写www.domain.com/pathname/#/pathname 来接触我们不同的应用程序。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2013-01-22
    • 2021-12-27
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多