Nginx 代理拦截重定向并将自定义重定向传递给客户端

2023-12-04

我有一个 Web 应用程序想要在未启用 CORS 的情况下从第三方站点访问文件。请求可以是具有任意参数的任意域。我正在向我的域发送一个请求,其中包含编码为 GET 参数的目标,即

GET https://www.example.com/proxy/?url=http%3A%2F%2Fnginx.org%2Fen%2Fdocs%2Fhttp%2Fngx_http_proxy_module.html

然后在 Nginx 中我做

location /proxy/ {
    resolver 8.8.8.8;
    set_unescape_uri $dst $arg_url;
    proxy_pass $dst;
}

这适用于单个文件,但目标服务器有时会返回一个 Location 标头,我想拦截并修改该标头以便客户端重试。

基本上我想转义 $sent_http_location,将其附加到https://www.example.com/proxy/?url=并将其传回浏览器以重试。

我试过做

set_escape_uri $tmp $sent_http_location;
proxy_redirect $sent_http_header /pass/?v=$tmp;

但这行不通。我还尝试保存 Location 标头,然后忽略传入的标头

proxy_hide_header

并用我自己的替换它

proxy_set_header

但忽略会导致我丢失保存它的变量。

如何配置 Nginx 来完成重定向处理,以便在代理站点重定向时将编码的 URL 返回给用户?


您的不成功方法存在几个问题:

  1. proxy_set_header设置发送到上游服务器而不是客户端的标头。所以即使$sent_http_location不为空,您的配置不可能按您希望的方式工作。

  2. $sent_http_<header>变量指向与将发送到客户端的响应标头完全相同的内存区域。所以当proxy_hide_header生效后,指定的标头以及相应的值将从内存中删除$sent_http_<header>.

  3. set_escape_uri在请求处理的早期阶段工作,早于proxy_pass被称为并且Locationheader是从上游服务器返回的。所以它总是会处理当时的空变量$sent_http_location并且结果也将始终是空变量。

最后一个问题是最严重的。唯一的办法就是制作set_escape_uri之后工作proxy_pass是强制Nginx离开当前位置并重新开始处理。这可以通过error_page trick:

location /proxy/ {
    resolver 8.8.8.8;
    set_unescape_uri $dst $arg_url;
    proxy_pass $dst;

    proxy_intercept_errors on;
    error_page 301 = @rewrite_301;
}

location @rewrite_301 {
    set_escape_uri $location $upstream_http_location;
    return 301 /pass/?v=$location;
}

注意使用$upstream_http_location代替$sent_http_location。当 Nginx 离开该位置的上下文时,它假设请求将被代理到另一个上游,或者以其他方式处理,因此它会清除从最后收到的标头proxy_pass,为新的响应标头腾出空间。

Unlike $sent_http_<header>变量,表示将发送到客户端的响应标头,$upstream_http_<header>变量表示从上游收到的响应标头。因此,只有当请求代理到另一个上游服务器时,它们才会被新值替换。因此,一旦设置,这些变量就可以随时使用,并且不会被清除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx 代理拦截重定向并将自定义重定向传递给客户端 的相关文章

  • 如何在 Java 中获得无代理连接?

    我如何避免经历ProxySelector当与URLConnection或者更确切地说 如何获得保证不受 Java 知道的任何代理的连接 我以为这是什么代理 NO PROXY http docs oracle com javase 8 doc
  • 在Web应用程序中调用phonegap插件功能

    我正在构建我的第一个phonegap应用程序 当我打开该应用程序时 我立即将用户重定向 window location 到托管我的网络应用程序的服务器 是否可以从那里加载phonegap 插件 因为 deviceready 事件没有触发 我
  • 如何在运行 NGINX Docker 容器的 AWS EC2 上启用 HTTPS?

    我在 AWS 上有一个运行 Amazon Linux 2 的 EC2 实例 在上面 我安装了 Git docker 和 docker compose 完成后 我克隆了我的存储库并运行docker compose up让我的生产环境启动 我访
  • Django + uwsgi + ngnix + 调试关闭 = 服务器错误(500)

    我正在尝试设置一个由 Django uwsgi Nginx 组成的生产服务器 我正在关注的教程位于此处http www panta info blog 3 how to install and configure nginx uwsgi a
  • 提交表单后重定向是一个好习惯吗?

    我最近开始在提交网站上的某些表单 主要与购物车应用程序相关 后进行 header 重定向 到同一页面 以便用户不会通过刷新页面来执行意想不到的操作或者 后退 或 前进 并刷新页面 这是可以接受的做法吗 这是标准做法 称为redirect a
  • 如何将注销的用户重定向到 Java EE/JSF 中的主页? [复制]

    这个问题在这里已经有答案了 我需要只允许登录用户访问我的应用程序的大部分页面 我正在使用 JSF 2 开发 Java 企业应用程序 有谁知道我该怎么做 也许有一个配置文件 我在主页中有一个登录组件 我希望用户在单击页面上除少数项目之外的任何
  • NGINX hashbang 重写

    我想知道 hashbang url 的位置或重写 nginx 指令会是什么样子 基本上像前端控制器一样通过 hashbang 路由所有非 hashbanged url 所以 http example com about staff 将路由至
  • 为什么 opcache 没有刷新?

    我用guzzlehttp guzzle封装在拉拉维尔 8 升级到后PHP 8 I get Symfony Component ErrorHandler Error FatalError Invalid opcode 117 2 0 in f
  • 将旧锚链接重定向到新锚链接

    我正在彻底修改其他人为我的组织构建的网站 它最初设置为 不太好 的锚链接 其中包含空格 我已经用效果更好的新锚替换了这些锚 例子 其中一位老主播看起来像这样 course To Have哪些浏览器会幸运地转换为 course To 20Ha
  • 将代码从 htaccess 重写为 nginx 配置?

    我在将 htaccess 文件中的重写代码实现到 nginx 配置中时遇到问题 我已经尝试过生成器 http winnginx com htaccess http winginx com htaccess用于生成我的重写 代码 我的ngin
  • 常规请求期间 Django AJAX 请求未通过

    我有一个带有登录网页的 Django 站点 当提交页面上的登录表单时 它会执行登录视图 该视图会在其中运行一个需要很长时间处理 30秒左右 的函数 因此 为了在登录期间向客户端显示进度 一旦提交表单 登录页面上的 JS 函数就会开始向服务器
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • 连接到上游时 Nginx 错误:(13:权限被拒绝)

    我在我的中收到此错误nginx error log file 2014 02 17 03 42 20 crit 5455 0 1 connect to unix tmp uwsgi sock failed 13 Permission den
  • 使用 Nginx 在 Docker 容器内部署带有路由器的 Angular2

    我正在尝试部署一个使用框架的路由器功能的 Angular 2 但在 docker 容器内使用 nginx 为其提供服务时遇到一些问题 由 angular cli 构建的 Angular 应用程序具有如下文件结构 dist 08c42df75
  • 错误请求 400:nginx/gunicorn

    我已经遵循了这个教程 http blog wercker com 2013 11 25 django 16 part3 html http blog wercker com 2013 11 25 django 16 part3 html我现
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • PHP cURL 在本地工作,在 AWS 服务器上出现错误 77

    最新更新 脚本作为管理员用户通过 SSH shell 作为 php script php 成功运行 当由 nginx 用户运行时 curl 命令无法执行 https 请求 所以我猜测这是nginx用户无法正确使用curl的问题 我已经检查了
  • 如何通过 kubectl 代理访问此 Kubernetes 服务?

    我想通过以下方式访问我的 Grafana Kubernetes 服务kubectl 代理服务器 https kubernetes io docs user guide kubectl v1 7 proxy 但由于某种原因 即使我可以使其适用
  • Symfony 2:如果用户具有特定角色,则将用户重定向到页面

    我有一个小问题 我希望无论用户在我的网站上哪里 如果他具有 ROLE DEGRADE 角色 他就会被重定向到特定页面 我该怎么做 我必须使用防火墙 我不想将用户重定向到表单登录 而只是重定向到一个简单的页面 我希望在我的网站上随处可见 而不
  • 编辑 HTACCESS 文件以防止直接访问特定文件夹中的特定文件

    我试图阻止直接访问子文件夹中的特定文件 我意识到这个论坛上有很多描述类似问题的主题 但是 我的似乎有点尴尬 由于我已经存在 HTACCESS 文件 这是文件的文件路径 www example com PRINCIPAL PROJECTS m

随机推荐

  • 在 Delphi 中实施变更日志

    我正在寻求使用改变日记代替ReadDirectoryChangesW跟踪我的delphi XE2应用程序中的更改 至于为什么 ReadDirectoryChangesW 不太可靠 我在delphi pascal中能找到的最接近的是一个叫做D
  • 反应式表单 - 禁用属性

    我正在尝试使用disabled属性来自于formControl 当我将其放入模板中时 它会起作用
  • perl 文件大小计算不起作用

    我正在尝试编写一个简单的 perl 脚本 它将迭代目录中的常规文件并计算所有文件放在一起的总大小 但是 我无法获取文件的实际大小 而且我不明白为什么 这是代码的相关部分 我放入打印语句进行调试 totalsize 0 while readd
  • CSS 2 div大小自动相同高度

    我有一个 CSS 问题 我怎样才能做到这一点 当绿色 div 的内容高度 自动 为 500px 时 红色 div 的高度相同 当红色的内容高度 自动 为 700px 时 绿色的高度也相同 两者都有任何内容 然后我使用自动高度 那么我怎样才能
  • Java 异常作为已检查异常但不需要在 trycatch 中抛出

    我有这个片段 public final class StackOverflow class MyException extends Throwable private void a try catch MyException Excepti
  • PHP Scandir 返回额外的句点

    所以我试图构建一个脚本来扫描目录并返回随机图像用作背景 php 看起来像这样 dir views img bg dh opendir dir while false filename readdir dh files filename ra
  • 无法将shared_ptr作为shared_ptr引用传递

    在下面的代码中 我想通过shared ptr
  • Java相当于python“dir”?

    java中的python中是否有相当于 dir 的东西 或者提供类似功能的库 即对象和类的属性输出为信息字符串 这个问题与此类似question对于 clojure 来说 可能与 Java Reflection 有关 如下所示questio
  • Django Rest Framework:动态返回字段的子集

    Problem 正如博文中推荐的那样设计实用的 RESTful API 的最佳实践 我想添加一个fields查询参数传递给基于 Django Rest Framework 的 API 该 API 使用户能够仅选择每个资源的字段子集 Exam
  • Alamofire http json 请求块 ui

    我一直在创建一个从 JSON 脚本检索对象的函数 我选择使用 alamofire 进行异步请求 使用 swiftyJSON 进行轻松解析 但是我似乎有一个问题 它阻止了用户界面 当它是异步请求时 为什么会这样做 我是否需要在单独的线程上运行
  • 在c# winform中通过TabIndex获取元素的文本

    如何在 Windows 窗体中通过 TabIndex 获取元素的文本 像这样 this Controls GetElementByTabindex 1 text 是否可以 是的 可以用LINQ var text this Controls
  • 为什么需要 RTTI?

    为什么需要 RTTI 运行时类型信息 RTTI 运行时类型信息 引入了 C 的 温和 反射形式 例如 它允许了解超类的类型 从而允许处理全部派生自同一基类型的异构对象集合 以特定于各个超类的方式 假设您有一个 车辆 对象数组 并且需要以不同
  • 如何防止在按 R.Alt+ 键时激活 Ctrl+Alt+ 键绑定?

    I have one very annoying issue with Eclipse under Windows The key bindings for Ctrl Alt key are activated when I press R
  • 包含 3 个表的复杂 IF 语句

    这是一个延续这个问题是昨天的 这是我的三张表 战士表 fighter id name 1 John 2 Steve 3 Bill 4 Bobby 活动表 event id event name event date 1 MMA 01 01
  • SQL 语句所有可能的第一个单词是什么?

    我正在构建一个用户界面 以便能够在 SQL Server 数据库上执行 SQL 语句 兼容 SQL Server 2008 R2 我需要能够确定每个语句是否可能返回数据集 或者是否只需要执行 在德尔福 TADOQuery由以下任一组成Ope
  • 链式方法调用不适用于原始元素或克隆元素,为什么?

    我有以下 HTML
  • file_put_contents():此流不支持独占锁,Laravel Mac OS X

    我正在使用 mac os x Sierra 我安装了 laravel 并尝试解决错误 但无法成功 任何人都可以帮助我 我按照以下步骤操作 更改存储文件夹的权限 缓存清除 作曲家已更新 Mac OS X 塞拉利昂 将 Filesystem p
  • 如果重复使用范围结果,是否应该缓存它们?

    我对 python 比较陌生 我正在尝试针对 HackerRank 问题优化一些代码 我发现使用很奇怪range 即生成列表 比仅使用更快while使用单个变量循环进行迭代 我想知道缓存结果是否更快range如果我稍后在代码中迭代相同的序列
  • 如何在滚动窗口中应用Python中的赫斯特指数

    我正在尝试在滚动窗口上应用 SPY 收盘价的赫斯特指数 下面的代码 我从这里得到的 https www quantstart com articles Basics of Statistical Mean Reversion Testing
  • Nginx 代理拦截重定向并将自定义重定向传递给客户端

    我有一个 Web 应用程序想要在未启用 CORS 的情况下从第三方站点访问文件 请求可以是具有任意参数的任意域 我正在向我的域发送一个请求 其中包含编码为 GET 参数的目标 即 GET https www example com prox