Nginx 如何在配置文件中实现CORS

跨源资源共享(CORS) 经常成为开发人员在尝试与托管在不同域上的 API 交互时遇到的障碍。当直接服务器配置不可行时,挑战会加剧,将开发人员推向诸如广泛使用的 **cors-anywhere 这样的替代解决方案。然而,NGINXproxy_pass 指令处理不仅局域网域和上游,还包括外部源的能力是相对较少为人所知的,例如:

proxy_pass 指令示例

理解基础和设置

CORS 是一种安全功能,限制了 Web 应用程序向服务其自身的域之外的域发出请求。这是一项至关重要的安全措施,用于防止恶意网站访问敏感数据。然而,在需要合法的跨域请求时,正确配置 CORS 至关重要。

NGINX 代理服务器提供了解决此困境的强大解决方案。通过利用 NGINX 的灵活配置系统,开发人员可以创建一个代理,处理 CORS 预检请求 并操纵标头以确保符合 CORS 策略。以下是操作方法:

变量声明和操纵

通过 map 指令,NGINX 允许基于现有全局变量声明新变量,并为动态处理提供正则表达式支持。例如,可以实现从 URL 中提取特定路径,从而精确控制请求处理。

map 指令示例

因此,当请求 http://example.com/api 时,$my_request_path 变量将包含 api

标头管理

NGINX 通过 add_headerproxy_set_header 方便地向响应添加自定义标头,并通过 proxy_hide_header 隐藏来自代理服务器的标头,确保仅将必要的信息传递回客户端。

add_header 示例

现在我们有了一个带有 X-Request-Path 标头的 api

条件处理

通过 if 指令,NGINX 可以根据特定条件执行操作,例如为 OPTIONS 方法请求返回预定响应代码,简化 CORS 预检 的处理。

if 指令示例

将所有内容整合在一起

首先,让我们声明 $proxy_uri,我们将从 $request_uri 中提取:

声明 $proxy_uri 以从 $request_uri 中提取

简而言之,它的工作原理如下:当请求 http://example.com/example.com 时,$proxy_uri 变量将包含 https://example.com

从生成的 $proxy_uri 中提取将与 Origin 标头匹配的部分:

从生成的 $proxy_uri 中提取将与 Origin 标头匹配的部分

对于 Forwarded 标头,我们需要同时处理两个变量:

对于 Forwarded 标头,我们需要同时处理两个变量

处理后的 X-Forwarded-For 标头已经内置在 NGINX 中。

现在我们可以开始声明我们的代理服务器:

声明代理服务器

我们得到了一个最小限度工作的代理服务器,可以处理 CORS 预检请求 并添加适当的标头。

提升安全性和性能

除了基本设置外,进一步的改进可以提高安全性和性能:

隐藏 CORS 标头

NGINX 内部处理 CORS 时,从客户端响应中隐藏这些标头是有益的,以防止暴露服务器内部。

从客户端响应中隐藏这些标头,以防止暴露服务器内部

绕过速率限制

将客户端的 IP 传递给某种方式绕过速率限制也是一种好方法,如果有几个用户访问相同的资源,就会出现这种情况。

将客户端的 IP 传递给绕过速率限制

禁用缓存

最后,对于动态内容或敏感信息,禁用缓存是一种最佳实践,确保数据的新鲜性和隐私。

禁用缓存

总结

本指南不仅揭示了配置 NGINX 处理 CORS 请求 的过程,还使开发人员掌握了创建一个强大、灵活的代理服务器的知识,该服务器能够支持各种应用程序需求。通过仔细的配置和对 CORS 策略以及 NGINX 能力的理解,开发人员可以克服跨源限制,提高应用程序性能,并确保数据安全。这种对 NGINX 的高级理解和应用不仅解决了常见的 Web 开发障碍,还展示了在导航 Web 安全和资源共享挑战时可能实现的技能和创新的深度。

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Nginx配置CORS(跨源资源共享),您需要编辑Nginx配置文件并添加相关配置。 首先,打开Nginx配置文件。默认情况下,该文件通常位于以下位置之一: - /etc/nginx/nginx.conf - /etc/nginx/conf.d/default.conf 找到您希望启用CORS服务器块或位置块,并在其添加以下配置: ``` location / { # 允许的来源(域名) if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } if ($request_method = 'POST') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; } if ($request_method = 'GET') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; } # 其他配置... } ``` 在上面的配置,我们允许所有来源('*')跨域访问。您可以根据需要更改为特定的域名。 配置完成后,保存文件并重新加载Nginx配置,以使更改生效。您可以使用以下命令重新加载Nginx: ``` sudo service nginx reload ``` 现在,您的Nginx服务器应该已经启用了CORS,并允许跨域访问。请确保您的应用程序也正确处理CORS 头部。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值