Skip to content

nginx 反向代理

如果前后端分开部署出现跨域问题也可以设置 nginx 反向代理,把接口请求转发到后端项目。

设置环境变量

在正式环境变量文件中设置 nginx 反向代理。

.env.production.local

txt
# 正式环境


# 接口地址 baseURL
VITE_APP_BASE_URL = 'https://api.yyladmin.top'
# 公共基础路径 base
VITE_APP_BASE = '/'
# 输出目录 outDir
VITE_APP_OUT_DIR = 'dist'
# 本地存储前缀 storePrefix
VITE_APP_STORE_PREFIX = 'admin_'

# 前后端同域名部署
# VITE_APP_BASE_URL = ''
# VITE_APP_BASE = '/admin/'
# VITE_APP_OUT_DIR = 'admin'

# nginx 反向代理
VITE_APP_BASE_URL = '/prodapi'

配置反向代理

前后端同机器部署

如果是前后端部署在同一台机器上,可以在机器内部直接转发请求到后端服务。
先在后端项目增加监听端口和服务名称,比如 127.0.0.1:8080,然后配置前端项目 proxy_pass。

nginx
# 后端项目 nginx 配置文件
server {
    listen 8080; # 增加监听端口8080
    server_name api.yyladmin.top 127.0.0.1; # 增加服务名称127.0.0.1
}
nginx
# 前端项目 nginx 配置文件
server {
    # 反向代理配置
    location /prodapi/ {
        # 将 http://127.0.0.1:8080 替换为您的后端服务名称和端口,并注意保留后面的斜杠 /
        proxy_pass http://127.0.0.1:8080/;
    }
}

其它的一些 nginx 配置可能会影响到 nginx 反向代理不生效,比如宝塔面板后端项目开启了强制 https

nginx
# 强制 https
#HTTP_TO_HTTPS_START
set $isRedcert 1;
if ($server_port != 443) {
    set $isRedcert 2;
}
if ( $uri ~ /\.well-known/ ) {
    set $isRedcert 1;
}
if ($isRedcert != 1) {
    rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END

需求修改一下重定向逻辑:如果 host 是 127.0.0.1,则不重定向

nginx
# 强制 https
#HTTP_TO_HTTPS_START
set $isRedcert 1;
if ($server_port != 443) {
    set $isRedcert 2;
}
if ( $uri ~ /\.well-known/ ) {
    set $isRedcert 1;
}
# 如果host是127.0.0.1,则不重定向
if ($host = 127.0.0.1) {
    set $isRedcert 1;
}
if ($isRedcert != 1) {
    rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END

前后端不同机器部署

如果前后端部署在不同机器上,直接增加 proxy_pass 配置即可。

nginx
# 前端项目 nginx 配置文件
server {
    # 反向代理配置
    location /prodapi/ {
        # 将 https://api.yyladmin.top 替换为您的后端接口地址,并注意保留后面的斜杠 /
        proxy_pass https://api.yyladmin.top/;
    }
}

注意

WARNING

因为是先请求到前端项目,然后再从前端项目转发到后端项目,所以会加长接口请求路径,接口响应时间可能会有所增加。

Apache-2.0 License