系统地将片段添加到 URL

系统地将片段添加到 URL

我有一个启用了 的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;
}

相关内容