Azure 应用服务无法在 React-Redux Web 应用中使用自定义路由 - 需要通配符虚拟目录吗?

IT技术 javascript reactjs azure routes azure-web-app-service
2021-05-07 13:05:17

我有如下自定义路线:

// @flow

import React, { PureComponent } from 'react';
import { Switch, Redirect } from 'react-router-dom';
import { withRouter } from 'react-router';

import { Route } from 'components/Routes';
import Story from 'pages/Story';
import Page404 from 'pages/404';

class Routes extends PureComponent<{}> {
  render() {
    return (
      <Switch>
        <Route exact path="/" render={props => <Story {...props} />} />
        <Route
          exact
          path="/chapter/:id"
          render={props => <Story {...props} />}
        />
        <Route path="/404" render={props => <Page404 {...props} />} />
        <Redirect to="/404" /* Must be the last one */ />
      </Switch>
    );
  }
}

export default withRouter(Routes);

这在 localhost 中工作正常,如果我访问 localhost:3000/chapter/3,Web 应用程序会成功重定向,不幸的是,如果我访问:mysite.azurewebsites.net/chapter/3,则在运行在 azure 应用程序服务上的实时构建中出现错误:

您要查找的资源已被删除、更名或暂时不可用。

我正在运行基于 Windows 的应用服务计划。我确定有一些选项可以设置重定向,即 /chapter/* -> /www_siteroot/ 但我一直无法弄清楚如何去做。

我通过转到应用程序服务设置并在“虚拟应用程序和目录”下添加 /chapter/1、/chapter/2 等并将它们定向到站点\wwwroot 来解决该问题。

我更喜欢像 /chapter/* 这样的通配符选项,但它似乎不起作用,并且出现错误。

2个回答

如果将存储库连接到 Azure Web 应用程序,则可以将此web.config文件放在/publiccreate-react-app 项目文件夹中。

<?xml version="1.0"?>
<configuration>
    <system.webServer>

        <directoryBrowse enabled="false"/>

        <urlCompression doDynamicCompression="true" doStaticCompression="true"/>

        <!-- <staticContent>
            <clientCache cacheControlMaxAge="120.00:00:00" cacheControlMode="UseMaxAge"/>
        </staticContent> -->
        <caching enabled="true" enableKernelCache="true">
            <profiles>
                <add extension=".css" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange"/>
                <add extension=".js" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange"/>
                <add extension=".svg" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange"/>
                <add extension=".png" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange"/>
            </profiles>
        </caching>

        <rewrite>
            <rules>
                <rule name="React Routes" stopProcessing="true">
                    <match url=".*" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/index.html" />
                </rule>
            </rules>
        </rewrite>

    </system.webServer>
</configuration>

由于您使用的是基于 Windows 的应用服务计划,因此您的 Azure Web 应用程序在启用了 URL 重写module的 IIS 下运行。因此,您可以创建一个简单的URL Rewrite规则,将所有请求定向https://mysite.azurewebsites.net/chapter/*到您的站点根目录,在这种情况下,客户端将接收您的React/Redux应用程序,并且您的React应用程序将负责所有后续逻辑和内容呈现等。

以下是创建此URL Rewrite规则的步骤

  1. 在 Azure 门户中,创建FTP 部署凭据
  2. 在您的计算机本地,创建一个Web.config包含以下内容文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Chapter-Redirect" stopProcessing="true">
                    <match url="chapter/*" />
                    <action type="Rewrite" url="/" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
  1. 打开 FTP 客户端(Filezilla 是一个很好的客户端)并登录到您的站点并上传Web.config文件。
  2. 通过访问测试: https://mysite.azurewebsites.net/chapter/*

这是有关IIS URL 重写的更多信息