You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Nginx反向代理后检测URL哈希值中指定词汇并拦截请求

解决Nginx拦截URL哈希值中包含特定词汇的问题

首先得明确一个关键知识点:浏览器不会把URL中#后面的片段标识符(fragment)发送给服务器。也就是说,当用户访问https://www.zeroapp.com:17882/myapp/app/myapp#/.../abc/...时,Nginx接收到的请求路径只有/myapp/app/myapp,完全看不到#后面的内容——所以直接在Nginx层面拦截哈希里的“abc”是做不到的。

不过我们可以通过两种思路来实现你的需求:

方案一:前端JavaScript拦截

这是最直接的方式,因为哈希值本身就是浏览器端处理的内容。你可以在页面加载或路由变化时检查哈希内容,一旦发现包含“abc”就执行拦截逻辑(比如跳转到提示页面、阻止路由跳转等)。

示例代码:

// 监听哈希变化事件
window.addEventListener('hashchange', checkHash);
// 页面加载完成后先检查一次当前哈希
window.addEventListener('load', checkHash);

function checkHash() {
  const currentHash = window.location.hash;
  if (currentHash.includes('abc')) {
    // 这里写你需要的拦截逻辑,比如跳转到禁止访问页面
    window.location.href = '/myapp/access-blocked';
    // 如果用了Vue/React这类框架的路由,也可以在路由钩子中做类似判断拦截
  }
}

方案二:前端重写URL,将哈希转为查询参数(配合Nginx拦截)

如果必须在服务器端处理,我们可以让前端把哈希部分转为查询参数发送给服务器,再让Nginx拦截这个参数。

1. 前端重写URL逻辑

在页面初始化时,若哈希存在,就把#后的内容转为查询参数:

window.addEventListener('load', () => {
  if (window.location.hash) {
    const hashContent = window.location.hash.slice(1); // 去掉开头的#
    // 重定向到带查询参数的URL,避免重复重定向可以加个判断
    if (!window.location.search.includes('hash=')) {
      window.location.replace(`/myapp/app/myapp?hash=${encodeURIComponent(hashContent)}`);
    }
  }
});

2. Nginx配置拦截规则

此时Nginx可以拿到hash查询参数,添加规则拦截包含“abc”的请求:

location /myapp {
    rewrite /myapp/(.*)$ /$1 break;
    proxy_pass http://localhost:6700;
    
    # 拦截查询参数hash中包含abc的请求,不区分大小写
    if ($arg_hash ~* "abc") {
        return 403; # 返回403禁止访问,也可以重定向到指定页面
        # 比如:rewrite ^ /myapp/blocked-page permanent;
    }
}

注意:这种方式会改变原有URL结构,可能影响用户体验或应用路由逻辑,需要根据你的实际场景权衡使用。


内容的提问来源于stack exchange,提问作者Sam

火山引擎 最新活动