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:
RewriteEngine on
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /wwwroot/$1 [L]
Run Code Online (Sandbox Code Playgroud)
我从这个超级用户的回答中得到了它。
有一个关于如何在 Apache 上托管的 Microsoft 文档,但缺少重写部分。
根据上述微软文档,我能够解决这个问题:
不要将“wwwroot”文件夹放入Apache网站的根文件夹中。
相反,请将“wwwroot”文件夹的内容直接放入 Apache 网站的根文件夹中。
不要将任何 mod_rewrite 规则放入“.htaccess”文件中。
将此指令添加到“.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)
上面的示例是直接从 Apache 网站的根文件夹运行 Blazor WebAssembly 应用程序。
如果您想从子文件夹(假设为“/myappinfolder”)运行它,则必须更改一些内容:
将所有文件(包括“.htaccess”文件)移动到子文件夹“myappinfolder”中。
ErrorDocument将“.htaccess”文件中的指令修改为:
ErrorDocument 404 /myappinfolder/index.html
Run Code Online (Sandbox Code Playgroud)
将“index.html”文件中的基本 href 更改为:
<base href="/myappinfolder/" />
Run Code Online (Sandbox Code Playgroud)
除了使用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答案的想法)
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           408 次  |  
        
|   最近记录:  |