我有一个启用了 的mean-stack
网站html5mode
。在 中index.html
,我有<base href="/1/" />
。并且我有以下 nginx 设置,使得www.myweb.com/home
自动变为www.myweb.com/1/home
(www.myweb.com/js/abc.js
保持www.myweb.com/js/abc.js
):
location ~* ^/\b(?!1|stylesheets|js)\w+\b/? {
rewrite .* /1$request_uri redirect;
}
现在,我必须添加一个特殊的库,但不幸的是,它会禁用html5mode
。所以我打算放弃html5mode
整个网站。
所以现在我期望重写规则如下
www.myweb.com/home ==> www.myweb.com/1/#/home
www.myweb.com/js/controller.js ==> www.myweb.com/js/controller.js
www.myweb.com/1/abc/def ==> www.myweb.com/1/#/abc/def
www.myweb.com/1/#/abc/def ==> www.myweb.com/1/#/abc/def
有人知道如何修改上述重写以启用此功能吗?因为我的网站上线了。我想在更改生产之前确认规则...
编辑1:我想如果我写
location ~* ^/\b(?!1|stylesheets|js)\w+\b/? {
rewrite .* /1/#$request_uri redirect;
}
这将导致
www.myweb.com/home ==> www.myweb.com/1/#/home (correct)
www.myweb.com/js/controller.js ==> www.myweb.com/js/controller.js (correct)
www.myweb.com/1/abc/def ==> www.myweb.com/1/abc/def (wrong)
www.myweb.com/1/#/abc/def ==> www.myweb.com/1/#/abc/def (correct)
答案1
这个答案在原始问题的背景下不再有效。我对这个问题的结论下得太快了。
经过核实事实后,我发现https://www.rfc-editor.org/rfc/rfc7231文中提到,HTTP 重定向可以包含片段标识符。但这与下面的描述并不矛盾,因为信息仅根据服务器端规则传递给客户端。
不过,我不知道在 nginx 中是否可以实际重定向到带有片段标识符的目标 URL。
--- 原始答案 ---
片段标识符根本不会出现在 HTTP 请求中。它纯粹是一个浏览器端概念,你无法用服务器端软件对其进行任何处理。
例如,当页面中有指向 的链接时http://www.example.com/main/#part1
,用户点击该链接,浏览器会向 发送 HTTP 请求http://www.example.com/main/
,然后向下滚动到标有part1
标识符的部分。这是默认行为。
您需要修改服务器上的实际 HTML 页面以获取所需的片段标识符。
答案2
/js
您可以为您的路径使用单独的块:
location ^~ /js {
... directives for this path ...
}
告诉^~
nginx 不要检查此 URL 路径的正则表达式。有关 nginxlocation
指令及其顺序的更多信息,请参阅http://nginx.org/en/docs/http/ngx_http_core_module.html#location。
答案3
我已经使用了这个重定向:
# Firts exclude all static files
location ~* (\/)(assets|css|fonts|img|js|lib|locales)(\/)(.*) {}
location ~ /templates {
index index.html index.htm;
try_files $uri.html $uri $uri/ =404;
}
# point to your main file
location = /1 {
try_files /index.html;
}
# finally make the redirect
# redirect for old html5Routing
#location ~ \/ {
# rewrite ^ http://$host/1#$uri redirect;
# break;
#}
# redirect for current html5Routing
location ~ \/ {
rewrite ^ http://$host/1#!$uri redirect;
break;
}