You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 14 SSR部署Azure Web App:如何正确使用server文件夹?

解决Azure Web App部署Angular 14 SSR的API响应异常问题

你的问题核心在于只部署了Angular SSR的前端(browser)目录,完全没配置SSR的服务端(server)逻辑,而且当前的web.config会把所有非文件/目录的请求都重写到index.html——这就是为什么API返回200但内容是HTML的原因。

修复步骤

1. 调整部署目录结构

把dist目录下的browser和server两个文件夹都上传到Azure Web App的site/wwwroot目录下,最终结构应该是:

site/wwwroot/
├─ browser/
│  ├─ index.html
│  └─ 静态资源文件...
└─ server/
   └─ main.js (或server.js,取决于你的Angular构建输出)

2. 更新web.config配置

替换原有的web.config,新增规则区分静态资源、API请求和SSR路由:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <webSocket enabled="false" />
    <handlers>
      <!-- Node.js handler for SSR and API -->
      <add name="iisnode" path="server/main.js" verb="*" modules="iisnode"/>
    </handlers>
    <rewrite>
      <rules>
        <!-- 优先处理静态资源 -->
        <rule name="StaticContent" stopProcessing="true">
          <match url="([\S]+[.](html|css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot))" />
          <action type="Rewrite" url="browser/{R:1}"/>
        </rule>
        <!-- 转发API请求到SSR服务端 -->
        <rule name="API Routes" stopProcessing="true">
          <match url="^api/(.*)" />
          <action type="Rewrite" url="server/main.js"/>
        </rule>
        <!-- 所有其他路由交给SSR处理 -->
        <rule name="SSR Routes" 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="server/main.js"/>
        </rule>
      </rules>
    </rewrite>
    <security>
      <requestFiltering>
        <fileExtensions>
          <add fileExtension=".svg" allowed="true" />
          <add fileExtension=".woff" allowed="true" />
          <add fileExtension=".woff2" allowed="true" />
        </fileExtensions>
      </requestFiltering>
    </security>
    <httpProtocol>
      <customHeaders>
        <!-- 按需启用安全头 -->
        <!-- <add name="X-Content-Type-Options" value="no-sniff"/>
        <add name="X-Frame-Options" value="SAMEORIGIN"/>
        <add name="X-Xss-Protection" value="1; mode=block"/>
        <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains"/> -->
      </customHeaders>
    </httpProtocol>
    <httpRedirect enabled="false" destination="" />
    <!-- 配置iisnode日志 -->
    <iisnode node_env="production" loggingEnabled="true" />
  </system.webServer>
</configuration>

3. 设置Azure启动命令

在Azure Web App的配置页面 → 常规设置 → 启动命令中,填入:

node server/main.js

注意:如果你的server目录下入口文件是server.js,就改成node server/server.js

关键说明

  • 本地运行正常是因为Angular CLI的SSR命令(ng serve --ssr)会同时启动前端静态服务和SSR服务端,自动处理请求转发;但Azure上默认只会处理静态文件,必须手动配置路由转发到Node.js服务端。
  • 新的web.config逻辑:先匹配静态资源直接返回,API请求和页面路由都转发到SSR服务端,由Angular的SSR逻辑处理API响应和页面渲染。

内容的提问来源于stack exchange,提问作者Lampdo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:18:31