【问题标题】:Nginx rewrite rule is not working if hash in the url如果 url 中有哈希,Nginx 重写规则不起作用
【发布时间】:2021-06-19 08:49:51
【问题描述】:

我已经编写了 nginx 重写规则来重定向所有对 /path/category 的请求,subcategory1 除外。我正在使用下面的正则表达式进行匹配,它在正则表达式测试器中工作正常。但是,当我在 Nginx conf 中提供相同的正则表达式时,如果 url 包含 # 字符,则它不适用于 negative lookahead。你有什么建议吗?

到目前为止尝试过的正则表达式:

^\/path\/category(?!.*(\bsubcategory1\b)).*$
^\/path\/category(([\/#]*)(?!.*(subcategory1))).*$

重写规则:

rewrite ^\/path\/category(?!.*(\bsubcategory1\b)).*$ https://new.host.com permanent;

路径详情: 它应该重定向到 https://new.host.com 工作正常

/path/category
/path/category/
/path/category#/
/path/category/#/

跳过 subcategory1 的重定向。它不适用于包含哈希的最后 3 个 url。

/path/category/subcategory1
/path/category/subcategory1/
/path/category/subcategory1/dsadasd
/path/category#/subcategory1
/path/category/#/subcategory1
/path/category#/subcategory1/dadsd

【问题讨论】:

  • 以#开头的那部分URL称为URI fragment,在原始请求中从未发送到Nginx,所以这里Nginx帮不了你。

标签: regex nginx url-rewriting regex-lookarounds nginx-location


【解决方案1】:

URI 中 # 之后的任何内容都将被忽略,因为它应该是客户端,因此它永远不会到达 HTTP 服务器(例如 Nginx)。

如果正在处理的字符串中有#,Nginx 正则表达式将显示异常行为。

# 之后的部分称为fragment

片段可以在客户端处理。

您可以使用 window.location.hash 来访问和处理片段。

这个 Javascript 示例将请求中参数中的片段转换为 process.html

let param = window.location.hash;
param = param.substring(1); // remove #
param = '?' + param;
console.log('param=',param);
location.href = '/process.html' + param;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2018-04-05
    • 2015-07-05
    相关资源
    最近更新 更多