解决Vue生产环境API 404问题:IIS部署实战指南

xieshuoshuo 发布于 2025-10-12 291 次阅读 预计阅读时间: 5 分钟


在将Vue应用部署到IIS时,你是否遇到过开发环境正常但生产环境API请求404的问题?本文将分享两种实用的解决方案,帮你彻底解决这个困扰。

问题背景

最近在部署一个Vue + .NET Core前后端分离项目时,遇到了一个典型问题:

  • 开发环境:Vue运行在8080端口,.NET Core API运行在5050端口,通过webpack dev-server代理,一切正常
  • 生产环境:前后端都通过IIS部署后,前端API请求全部返回404

这个问题的核心在于:开发环境中的webpack代理配置在生产环境中无效,需要为IIS配置正确的请求转发机制。

解决方案一:配置IIS反向代理(推荐)

这是最优雅的解决方案,通过IIS的URL重写和ARR模块实现请求转发。

1. 安装必要模块

首先需要安装两个IIS模块:

可以从IIS官网下载这两个模块。

2. 启用ARR代理功能

安装完成后,在IIS管理器中:

  1. 选择服务器节点(非具体网站)
  2. 打开"Application Request Routing Cache"
  3. 点击"Server Proxy Settings"
  4. 勾选"Enable proxy"
  5. 应用设置

3. 配置URL重写规则

在前端站点的web.config文件中添加以下配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <!-- 规则1: 将API请求代理到后端服务器 -->
        <rule name="Proxy API requests" stopProcessing="true">
          <match url="^api/(.*)" />
          <action type="Rewrite" url="http://localhost:5050/{R:1}" />
        </rule>

        <!-- 规则2: Vue Router History模式支持 -->
        <rule name="Vue Router History Mode" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="/index.html" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

配置说明

  • 规则顺序很重要:API代理规则必须在Vue路由规则之前
  • ^api/(.*) 会匹配所有以/api/开头的请求
  • {R:1} 是正则表达式捕获组,代表api/后面的路径部分
  • stopProcessing="true" 确保匹配后不再执行后续规则

解决方案二:后端配置CORS

如果选择让前端直接请求后端地址,需要在后端配置CORS支持。

.NET Core 3.1 CORS配置

Startup.cs文件中进行以下配置:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        // 添加CORS服务
        services.AddCors(options =>
        {
            options.AddPolicy("AllowVueApp",
                builder => builder
                    .WithOrigins("http://localhost:8080") // 前端地址
                    .AllowAnyHeader()
                    .AllowAnyMethod());
        });
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        // 使用CORS中间件
        app.UseCors("AllowVueApp");

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

关键点说明

  • WithOrigins() 指定允许访问的前端域名
  • AllowAnyHeader() 允许所有请求头
  • AllowAnyMethod() 允许所有HTTP方法
  • 中间件顺序:UseCors()必须在UseRouting()之后、UseEndpoints()之前

方案对比

方案优点缺点适用场景
IIS反向代理前端无需修改代码,统一域名,更安全需要IIS额外配置生产环境部署,企业级应用
后端CORS配置简单,开发灵活需处理跨域问题,安全性考虑开发阶段,简单项目

故障排除技巧

1. 检查请求流转

在浏览器开发者工具的Network面板中:

  • 确认请求URL是否正确
  • 检查HTTP状态码和响应头
  • 验证请求是否被正确转发

2. 验证IIS配置

  • 确认URL重写模块和ARR已正确安装
  • 检查web.config文件语法是否正确
  • 确保应用程序池运行在集成模式

3. 测试连通性

  • 确认后端服务在5050端口正常运行
  • 检查防火墙是否允许端口通信
  • 使用工具直接测试后端API可用性

最佳实践建议

  1. 环境区分:使用环境变量管理不同环境的API地址
  2. 错误处理:在前端添加统一的HTTP错误处理
  3. 日志记录:在IIS和后端启用详细日志以便排查问题
  4. 安全考虑:生产环境中不要使用AllowAnyOrigin(),应明确指定允许的域名

总结

通过本文介绍的两种方案,你应该能够解决Vue应用在IIS部署中的API连接问题。IIS反向代理方案更适合生产环境,提供更好的安全性和一致性;后端CORS方案则更适合开发阶段或简单项目。

选择哪种方案取决于你的具体需求和技术栈特点。在实际项目中,我推荐使用IIS反向代理,因为它提供了更清晰的架构和更好的可控性。