如何将 Blazor WebAssembly IIS 重写规则转换为 Apache mod_rewrite?

Uwe*_*eim 5 apache iis mod-rewrite url-rewrite-module blazor-webassembly

创建示例 Blazor WebAssembly 应用程序后,我将其部署到 IIS 和 Apache 以进行测试。

发布应用程序时,它生成了一个文件夹“wwwroot”和一个文件“web.config”:

在此输入图像描述

“wwwroot”文件夹包含整个应用程序:

在此输入图像描述

部署到 IIS 时,一切正常。

我目前正在努力解决的是部署到 Apache 的问题。

“web.config”文件包含两个重写规则。

规则1:

<rule name="Serve subdir">
    <match url=".*" />
    <action type="Rewrite" url="wwwroot\{R:0}" />
</rule>
Run Code Online (Sandbox Code Playgroud)

规则 2:

<rule name="SPA fallback routing" stopProcessing="true">
    <match url=".*" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="wwwroot\" />
</rule>
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几件事来至少让规则 1 与 mod_rewrite 一起使用,例如:

RewriteEngine on
RewriteRule ^.*?$ /wwwroot [QSA]
Run Code Online (Sandbox Code Playgroud)

但我要么得到 404 要么无尽的重定向。

我的问题

如何将上述规则1和规则2转换为Apache mod_rewrite配置?


更新1

我确实认为这条规则可以有效替代规则 1:

RewriteEngine on
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /wwwroot/$1 [L]
Run Code Online (Sandbox Code Playgroud)

我从这个超级用户的回答中得到了它。

更新2

有一个关于如何在 Apache 上托管的 Microsoft 文档,但缺少重写部分。

更新3

根据上述微软文档,我能够解决这个问题:

  1. 不要“wwwroot”文件夹放入Apache网站的根文件夹中。

  2. 相反,请将“wwwroot”文件夹的内容直接放入 Apache 网站的根文件夹中。

  3. 不要将任何 mod_rewrite 规则放入“.htaccess”文件中。

  4. 将此指令添加到“.htaccess”文件中:

    ErrorDocument 404 /index.html
    
    Run Code Online (Sandbox Code Playgroud)

我的测试应用程序的完整、最小的“.htaccess”文件如下所示:

ErrorDocument 404 /index.html

AddType application/wasm .wasm
AddType application/octet-stream .dll

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE application/octet-stream
    AddOutputFilterByType DEFLATE application/wasm
    <IfModule mod_setenvif.c>
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4.0[678] no-gzip
        BrowserMatch bMSIE !no-gzip !gzip-only-text/html
  </IfModule>
</IfModule>
Run Code Online (Sandbox Code Playgroud)

更新4

上面的示例是直接从 Apache 网站的根文件夹运行 Blazor WebAssembly 应用程序。

如果您想从子文件夹(假设为“/myappinfolder”)运行它,则必须更改一些内容:

  1. 将所有文件(包括“.htaccess”文件)移动到子文件夹“myappinfolder”中。

  2. ErrorDocument将“.htaccess”文件中的指令修改为:

    ErrorDocument 404 /myappinfolder/index.html
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将“index.html”文件中的基本 href 更改为:

    <base href="/myappinfolder/" />
    
    Run Code Online (Sandbox Code Playgroud)

更新5

除了使用ErrorDocumentApache 指令,另一种选择是使用FallbackResourceApache 指令

FallbackResource /myappinfolder/index.html
Run Code Online (Sandbox Code Playgroud)

FallbackResource优点是,在将请求转发到配置的 URL(在我的示例中为“/myappinfolder/index.html”)时,它会保留 HTTP 方法(例如POST或)。GET

ErrorDocument始终使用 HTTP 方法将请求转发到配置的 URL(在我的示例中为“/myappinfolder/index.html”)GET

这个SO答案的想法)