在IIS上设置Angular深度链接

3
我将尝试配置一个Angular/ASP.NET 5应用程序,使其支持深度链接,以便像domain.com/article/title-slug这样的URL可以正常工作。我使用了IIS rewrite模块,并在web.config中添加了以下代码:
<rewrite>
    <rules>
        <rule name="redirect all" stopProcessing="true">
            <match url="^(.*)$" ignoreCase="false" />
            <conditions logicalGrouping="MatchAll">
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
            </conditions>
            <action type="Rewrite" url="wwwroot/index.html" appendQueryString="true" />
        </rule>
    </rules>
</rewrite>

我的问题是我的网站不再加载,我只看到一个空白屏幕,在网络选项卡中没有任何内容,也没有源代码。
我的inetpub\site\文件夹是dotnet core发布文件夹的根目录,而我的angular构建资产位于inetput\site\wwwroot中。
我的基本href是“/”,在没有重写代码的情况下一切正常运行。
最后,我尝试将我的重写URL更改为
<action type="Rewrite" url="/index.html" appendQueryString="true" />

但是,我开始遇到以下错误:

inline.f137c7f1f4e2a52a2fb9.bundle.js:1 Uncaught SyntaxError: Unexpected token <
polyfills.25e42e2a7a0746e9ff75.bundle.js:1 Uncaught SyntaxError: Unexpected token <
main.0d9f8e7be2ccd1472551.bundle.js:1 Uncaught SyntaxError: Unexpected token <

你的 Startup.cs 文件是什么样子的? - Brad
根据 SyntaxError: Unexpected token <,我会说你收到了错误页面的内容,而不是预期的JS包 - 不知道你的设置情况,我想问一下是否可以检查一下 * bundle.js 的内容...?顺便说一句,在我的设置中,只需要 <action type="Rewrite" url="/" appendQueryString="true" />(url参数只有"/")就足够了,它是基于OWIN的完整ASP.NET,不是Core。 - Tomas Varga
@Brad 我的startup.cs非常庞大 - 你能指出哪些部分会有帮助吗? - Evonet
2个回答

2

我也遇到了同样的问题。在尝试了很多方法之后,将index.html文件中的base href标签更改为完全限定的Url最终解决了我的问题。

修改前:

<!doctype html>
<html lang="en">

  <head>
    <meta charset="utf-8">
    <title>MySubApp</title>
    <base href="/">

    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" type="image/x-icon" href="favicon.ico">


  </head>

  <body>
    <mu-root></mu-root>

  <script type="text/javascript" src="inline.bundle.js"></script><script type="text/javascript" src="polyfills.bundle.js"></script><script type="text/javascript" src="scripts.bundle.js"></script><script type="text/javascript" src="styles.bundle.js"></script><script type="text/javascript" src="vendor.bundle.js"></script><script type="text/javascript" src="main.bundle.js"></script></body>

</html>

之后:

<!doctype html>
<html lang="en">

  <head>
    <meta charset="utf-8">
    <title>MySubApp</title>
    <base href="http://MyUrl.com/MySubApp/">

    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" type="image/x-icon" href="favicon.ico">


  </head>

  <body>
    <mu-root></mu-root>

  <script type="text/javascript" src="inline.bundle.js"></script><script type="text/javascript" src="polyfills.bundle.js"></script><script type="text/javascript" src="scripts.bundle.js"></script><script type="text/javascript" src="styles.bundle.js"></script><script type="text/javascript" src="vendor.bundle.js"></script><script type="text/javascript" src="main.bundle.js"></script></body>

</html>

我的重写规则:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="test" enabled="true" 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="/MySubApp/" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

我的使用案例是在默认网站下设置应用程序,因此您的设置可能会有所不同。


2
我最终通过放弃使用URL重写模块,改为在代码中处理来解决这个问题:
        app.Run(async (context) =>
       {
           context.Response.ContentType = "text/html";
           await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html"));
       });

2
这就是为什么我问你的 Startup.cs 文件的原因。我使用 app.UseDefaultFiles(); app.UseStaticFiles() 然后类似于你的方法来服务 index.html 文件。如果你愿意,我可以发布一个答案。 - Brad
请注意,对于Core 2.1,第一行变为app.Use(async (context, next) =>。此外,我将此代码放在了Startup.cs的最后。 - jaycer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接