Htaccess 重定向到 index.html,包括分号和 urlencoded 字符

Htaccess redirect to index.html including semicolons and urlencoded characters

我有一个 Angular 应用程序,所以我希望将所有流量重定向到 index.html,以便 Angular 可以处理它。

目前,我有以下 htaccess:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^.*$ /index.html [L,NC,QSA,NE]
</IfModule>

当我刷新页面时,所有内容都会正确刷新,但一些重要页面使用 Angular 的 ActivatedRoute.paramMap 传递状态,URL 看起来像这样: https://example.com/thing/edit;id=16;language=en;data=n%2Fa 如果我在这些页面上刷新,我会收到 404 错误。
请注意,正常导航到这些页面(例如通过单击链接)工作正常。
如果我用正确的参数和数据手动输入 URL,我会得到 404。但是,错误 似乎只在 [=35= 中有编码字符 时发生],比如上面的%2F。如果没有编码序列是 URL,行为是正确的。

期望的输出是,当我在包含 URL 类型(包括 URL 编码字符)的页面上刷新时,我没有得到 404,而是正确的页面,包括所有带分号的参数,供 Angular 解析。

我对 Apache 和 htaccess 几乎一无所知,我可以找到关于 SO 和 google 类似问题的提示也没有帮助。

such as the above %2F

%2F(编码斜杠)和 %5C(编码反斜杠)是特殊情况,默认情况下,如果这些编码字符出现在 URL 路径部分,Apache 将抛出 404 URL.

这是一项“安全”功能,因为“允许对斜杠进行解码可能会允许不安全的路径。” (source)

要允许 URL 中的编码斜杠,但不在服务器端对其进行解码,但允许 URL 通过,您可以在服务器配置中或直接在<VirtualHost> 容器(并重启 Apache):

AllowEncodedSlashes NoDecode

NoDecode 选项需要 Apache 2.4。 (在 Apache 2.2 上,您需要使用 On - 但这也会 解码 斜杠,然后再传递到后端。)

请注意,AllowEncodedSlashes 指令不能在 .htaccess(或 <Directory>)上下文中使用。

参考: