AI 问答
你是一个数学家,请问9.9和9.11哪个大?
企业微信机器人发送消息脚本
AI 问数实现主要步骤
人类感知延迟
Chrome 存储介绍
浏览器缓存
Linux 命令行中 && 和 ; 区别和用法
Windows 系统怎么修改 CPU 的显示型号信息和查看真实的 CPU 型号信息
at 命令详细指南
如何确保提交代码到 git 上时 CRLF 转成 LF
Apache License 2.0
从 0 创建一个 docker 镜像
Linux 文件系统及分区表和 LVM
Linux 查看分区表类型
Windows 批量文件名重命名
将文本文件中的 CRLF 批量转换为 LF
批量将 GB2312 编码转换为 UTF-8 编码
分区类型 MBR 和 GPT 有什么区别
exFAT 和 FAT32 有什么区别
文件的元数据 是什么
花括号展开(Brace Expansion)
cat 显示特殊字符
图标文件有什么在线制作的站点
发布 Chrome 扩展程序的步骤
常用加密方式
密码学的常用攻击方式
3D 打印学习路径
新手 FDM 3D 打印学习路径
Linux 备份和还原 PostgreSQL 数据库方案
数学符号
通过 nginx 转发解决跨域问题
所有希腊字母及其读法
通过 Docker Compose 部署 lscr.io/linuxserver/libreoffice 服务
通过 Docker Compose 部署 libreoffice/online
在 Linux 上为 Docker 配置代理
数学公式测试
祖宗十八代
Windows 重启文件管理器
小米手机怎么设置特殊号码
国债逆回购终极操作指南(2025完整版)——从基础原理到高阶自动交易策略
本文档使用 MrDoc 发布
-
+
首页
通过 nginx 转发解决跨域问题
## 方案 1: 使用 `rewrite` 通过 `rewrite` 去除 `/mrdoc` 前缀,以便后端服务器能够正确处理路径请求,并使用 `sub_filter` 动态更新响应中的路径前缀。 ### 优缺点 - **优点**: - **路径统一**:使用 `rewrite` 将 `/mrdoc` 前缀去除,使后端服务路径保持简单和一致。 - **灵活性**:可以动态适应不同的路径结构,并灵活处理请求。 - **缺点**: - **配置复杂度**:需要准确管理每个路径重写规则。 - **对资源路径的依赖**:需要确保所有资源路径在HTML响应中被正确替换。 ### 配置示例 ```nginx server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /mrdoc/ { rewrite ^/mrdoc/(.*)$ /$1 break; # 去掉请求路径中的 /mrdoc 前缀 proxy_pass http://third-part:10086/; proxy_set_header Host third-part; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; sub_filter 'href="/' 'href="/mrdoc/'; sub_filter 'src="/' 'src="/mrdoc/'; sub_filter_once off; # 确保所有匹配都被替换 proxy_redirect off; # 关闭proxy重定向 } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } ``` ## 方案 2: 不使用 `rewrite` 只使用 `sub_filter` 来动态修改响应内容中的路径前缀,保持原始请求路径不变。 ### 优缺点 - **优点**: - **配置简单**:不需处理复杂的路径重写规则,配置相对直接。 - **适应性强**:适用于已有资源路径结构固定的场景。 - **缺点**: - **路径固定**:所有路径替换必须事先定义清楚,并在响应中正确匹配。 - **可能的性能影响**:大量的 `sub_filter` 替换操作可能在高并发环境下影响性能。 ### 配置示例 ```nginx server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /mrdoc/ { proxy_pass http://10.101.16.25:10086/; proxy_set_header Host 10.101.16.25; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 处理子路径的前缀问题 sub_filter '"/static' '"/mrdoc/static'; sub_filter '(/static' '(/mrdoc/static'; sub_filter '"/project' '"/mrdoc/project'; sub_filter '(/project' '(/mrdoc/project'; sub_filter '"/doc' '"/mrdoc/doc'; sub_filter '(/doc' '(/mrdoc/doc'; sub_filter '"/media' '"/mrdoc/media'; sub_filter '(/media' '(/mrdoc/media'; sub_filter '\'/search' '\'/mrdoc/search'; sub_filter '"/search' '"/mrdoc/search'; sub_filter '(/search' '(/mrdoc/search'; sub_filter '"/get_pro_doc_tree/' '"/mrdoc/get_pro_doc_tree/'; sub_filter '"/create_doc/' '"/mrdoc/create_doc/'; sub_filter '"/modify_doc/' '"/mrdoc/modify_doc/'; sub_filter_once off; # 确保所有匹配都被替换 } access_log /var/log/nginx/zjark-access.log; error_log /var/log/nginx/zjark-error.log; } ``` ## 方案 3: 复杂场景的处理 对于更复杂的场景,需要处理路径重写和响应替换,有多种嵌套路径和特殊需求时,可以综合使用 `rewrite`、`sub_filter` 和正则表达式,以便处理复杂路径。 ### 优缺点 - **优点**: - **高适应性**:能够处理多种嵌套路径和特殊需求,方案灵活。 - **精细控制**:通过 `sub_filter` 和变量,可以对多种资源路径进行统一管理。 - **缺点**: - **复杂度高**:配置较为复杂,需要仔细管理每个路径和替换规则。 - **性能影响**:较多的正则匹配和替换操作可能影响性能。 #### 配置示例 ```nginx server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /mrdoc/ { rewrite ^/mrdoc/(.*)$ /$1 break; # 去掉请求路径中的 /mrdoc 前缀 proxy_pass http://third-part:10086/; proxy_set_header Host third-part; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; set $sub_filter_prefix '/mrdoc'; # 用于动态路径替换通配 sub_filter_types text/html application/javascript text/css application/xml text/xml; sub_filter 'href="/' 'href="$sub_filter_prefix/'; sub_filter 'src="/' 'src="$sub_filter_prefix/'; sub_filter 'action="/' 'action="$sub_filter_prefix/'; sub_filter 'url(/' 'url($sub_filter_prefix/'; sub_filter_once off; proxy_redirect off; } # 高级配置:处理特殊路径和API请求 location ~* ^/mrdoc/api/(.*)$ { rewrite ^/mrdoc/api/(.*)$ /api/$1 break; proxy_pass http://third-part:10086/api/$1; proxy_set_header Host third-part; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } ``` ## 方案 4: 使用 `ngx_http_substitutions_filter_module` 使用 `ngx_http_substitutions_filter_module` 模块可以在 Nginx 中实现复杂的字符串替换操作,支持对响应内容中的多个字符串进行替换和高级匹配规则。该模块更强大和灵活,尤其适用复杂的场景和大规模的字符串替换需求。 ### 如何安装 `ngx_http_substitutions_filter_module` 首先安装 `ngx_http_substitutions_filter_module`。如果你的 Nginx 没有预编译该模块,可以通过重新编译 Nginx 来安装它: ```bash # 下载 Nginx 和 ngx_http_substitutions_filter_module wget http://nginx.org/download/nginx-1.21.4.tar.gz wget https://github.com/yaoweibin/ngx_http_substitutions_filter_module/archive/master.zip # 解压下载的文件 tar -zxvf nginx-1.21.4.tar.gz unzip master.zip cd nginx-1.21.4 # 配置 Nginx 并添加 substitutions_filter 模块 ./configure --add-module=../ngx_http_substitutions_filter_module-master # 编译和安装 make sudo make install ``` 如果使用 Docker,可以基于官方的 Nginx Dockerfile 进行构建: ```dockerfile FROM nginx:latest RUN apt-get update && \ apt-get install -y git gcc make && \ git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module && \ wget http://nginx.org/download/nginx-1.21.4.tar.gz && \ tar -zxvf nginx-1.21.4.tar.gz && \ cd nginx-1.21.4 && \ ./configure --add-module=../ngx_http_substitutions_filter_module && \ make && \ make install CMD ["nginx", "-g", "daemon off;"] ``` ### 优缺点 - **优点**: - **性能提升**:在高并发环境下相比`sub_filter`具有更好的性能表现。 - **灵活性强**:支持复杂正则表达式替换,多次替换和更多高级功能。 - **支持多行替换**:可以处理跨行的替换需求。 - **缺点**: - **需要编译安装**:需要编译安装特定模块,增加了安装和管理难度。 - **配置复杂度**:复杂替换规则和正则表达式的使用,对配置要求较高。 ### 配置示例 ```nginx server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /mrdoc/ { rewrite ^/mrdoc/(.*)$ /$1 break; # 去掉请求路径中的 /mrdoc 前缀 proxy_pass http://third-part:10086/; proxy_set_header Host third-part; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 使用 substitutions_filter 进行路径前缀替换 subs_filter_types text/html text/css application/javascript application/xml text/xml; subs_filter 'href="/' 'href="/mrdoc/' gi; subs_filter 'src="/' 'src="/mrdoc/' gi; subs_filter 'action="/' 'action="/mrdoc/' gi; subs_filter 'url(/' 'url(/mrdoc/' gi; proxy_redirect off; } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } ``` ### 配置说明 1. **location /mrdoc/**: - `rewrite ^/mrdoc/(.*)$ /$1 break;`:移除请求路径中的 `/mrdoc` 前缀,使请求路径能够正确传递给后端服务器。 - `proxy_pass`:代理到第三方服务 `http://third-part:10086`。 - `subs_filter`:使用 `subs_filter` 进行高级路径前缀替换,支持全局和复杂的正则替换: - `subs_filter_types`:定义替换应用于哪些类型的内容(如 `text/html`, `application/javascript`)。 - `subs_filter 'href="/' 'href="/mrdoc/' gi`:将响应内容中的 `href="/path"` 替换为 `href="/mrdoc/path"`,`gi` 表示全局匹配和忽略大小写。 ## 总结: ### 方案 1:使用 `rewrite` - **优点**:路径统一,灵活性高。 - **缺点**:配置复杂度高,对资源路径依赖强。 - **适用场景**:需要动态重写路径且后端路径结构可变的场景。 ### 方案 2:不使用 `rewrite` - **优点**:配置简单,适应性强。 - **缺点**:路径固定,可能影响性能。 - **适用场景**:路径结构固定且简单的场景。 ### 方案 3:复杂场景的处理 - **优点**:高适应性,精细控制。 - **缺点**:配置和管理复杂度高,可能影响性能。 - **适用场景**:具有多种嵌套路径和复杂需求的场景。 ### 方案 4:使用 `ngx_http_substitutions_filter_module` - **优点**:性能提升,灵活性强,支持多行替换。 - **缺点**:需要编译安装模块,配置复杂度高。 - **适用场景**:在高并发环境下需要复杂字符串替换的场景。 根据实际需求和场景选择最合适的方案,以确保所有资源能够正确加载,避免跨域问题,并根据需要进行灵活配置。通过 Nginx 的多种配置方法,可以高效解决路径管理和代理相关的问题。
七宇轩远
2024年08月05日
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码