Angular 2托管在IIS上:HTTP错误404

fcy6dtqo  于 2023-04-30  发布在  Angular
关注(0)|答案(6)|浏览(142)

我有一个简单的应用程序与一个组件,期望从URL的某些参数。应用程序中只有一条路由:

const appRoutes: Routes = 
                       path: 'hero/:userId/:languageId',component: HeroWidgetComponent }];

在索引中。html,我在头中有这个<base href="/">
我使用的是webpack,应用程序在开发环境中运行良好,浏览url时:http://localhost:4000/hero/1/1
但是,当构建用于生产的应用程序并获取分发文件时,然后将其托管在IIS上。我在尝试浏览相同的URL时出现以下错误:

HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

如果我删除所有路由并浏览,应用程序工作正常:IIS上的http:localhost:4200

dm7nw8vv

dm7nw8vv1#

我们必须使IIS回退到索引。HTML中添加重写规则。

**第一步:**安装IIS URL Rewrite模块
**第二步:**在web上添加重写规则。配置

<?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.webServer>
        <rewrite>
          <rules>
            <rule name="AngularJS 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="/" />
            </rule>
          </rules>
        </rewrite>
      </system.webServer>
    </configuration>
hgqdbh6s

hgqdbh6s2#

**第三步:**添加web。配置链接到angular。json:(因为在ng build之后它会被跳过)

"architect": {
                "build": {
                    "builder": "@angular-devkit/build-angular:browser",
                    "options": {
                         ..........
                        "assets": [
                            "src/favicon.ico",
                            "src/assets",
                            **"src/web.config"**
                        ]
wwwo4jvm

wwwo4jvm3#

如果在默认网站下面使用的IIS应用程序(如myApp)(那么应用程序的URL应该具有语法http://localhost/myApp/my-angular-route),那么您应该尝试将操作修改为

<action type="Rewrite" url="/myApp/"/>;

然后它为我的环境工作,没有任何问题。
一步一步的说明可以在这里找到:https://blogs.msdn.microsoft.com/premier_developer/2017/06/14/tips-for-running-an-angular-app-in-iis/

cczfrluj

cczfrluj4#

通过在baseurl后添加#修改Angular 路由:
http://localhost:4200/yourApp #/subPageRoute
在应用路由中。module.ts与RouterModule联机。forRoot add“,{ useHash:真}”

RouterModule.forRoot(routes, { useHash: true })

这样,IIS会认为#后面的所有内容都是页面上的某个id,并忽略它。

gcxthw6b

gcxthw6b5#

不安装IIS URL重写

正如@tftd在对问题的评论中所解释的那样,IIS需要知道在找不到匹配的文件或文件夹时如何处理请求。
您可以将IIS配置为返回 index。html 每当请求具有路径和/或参数的路由(也称为 * 深度链接 *)时。

在IIS中手动操作

1.在IIS管理器中选择站点
1.打开 IIS 部分中的 * 错误页 * 图标
1.打开状态代码 404 列表项
1.选择 * 执行此站点上的URL * 单选按钮
1.输入SPA根路径,例如:联系我们
1.单击确定x1c 0d1x
不需要重新启动应用程序池,只需浏览到您的深层链接。服务器将以状态代码200响应。(在2021年的Windows Server 2016和IIS 10上测试)。
如果您的SPA不是以 /index为根。html,输入步骤5中应用的根目录文件夹或文件。
上述手动过程添加或更改 *web的 httpErrors 部分。配置 *:

<configuration>
    <system.webServer>
        <httpErrors>
            <remove statusCode="404" subStatusCode="-1" />
            <error statusCode="404" prefixLanguageFilePath="" path="/index.html" responseMode="ExecuteURL" />
        </httpErrors>
    </system.webServer>
</configuration>

为了避免在下一次部署后丢失此更改,请确保您的发布管道在 *web中保留 httpErrors 部分,如上面所示。配置 *。
这适用于 AngularReact 应用程序。

kkih6yb8

kkih6yb86#

复制并粘贴此网页。配置到根文件夹

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
 
  <rewrite>
    <rules>
      <rule name="Angular 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="./index.html" />
      </rule>
    </rules>
  </rewrite>
 
</system.webServer>
</configuration>

相关问题