Nginx使用#符号转发到不同应用程序的不同路径

时间:2019-09-05 08:37:15

标签: nginx url-rewriting path location

快速提问。我们有两个应用程序。端口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访问相同的链接。

如何缩短?我想念什么?

1 个答案:

答案 0 :(得分: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处理请求参数

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

请参见Nginx rewrite手册:

  

如果替换字符串包括新的请求参数,则先前的请求参数将附加在它们之后。如果不希望这样,请在替换字符串的末尾添加问号,避免附加它们,例如:

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