快速问题。我们有两个应用程序。端口3001
和3002
。我们的域名是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
.
如何缩短它?我错过了什么?
(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
不幸的是,你不能。因为服务器永远不会从浏览器获取片段标识符。
片段标识符的功能与 URI 的其余部分不同:它的处理完全是客户端的,没有 Web 服务器的参与
命名有点有趣,但它的历史悠久。参见TBL (1997(:URI上的片段标识符:
URI引用是通过获取信息对象的 URI、添加"#"符号,然后添加Fragement 标识符来构建的东西。(最后一个术语是历史的,所以尽量不要将其稀释,不一定是标识片段(。
解决方法
有一些解决方法,例如将主题标签符号编码为%23
但我不确定这是你的方式。
使用 nginx 处理请求参数
注意:重写 url,如果在指令末尾添加?
,nginx 可以保留请求参数rewrite
。
参见 Nginx 重写手册:
如果替换字符串包含新的请求参数,则以前的请求参数将追加到它们之后。如果不希望这样做,在替换字符串的末尾放置问号可以避免追加它们,例如:
rewrite ^/users/(.*)$ /show?user=$1? last;