如何通过 htaccess 在动态 URL 中将 % 转换为 #

How can I convert % to # in dynamic URL via htacesss

我们网站的链接是这样的:

https://www.example.com/video.html#11

但我不知道为什么,有时有些网站会像这样转换我们的哈希值:

https://www.example.com/video.html%11

所以我尝试了这条线,它有效,但链接是动态的,因为视频的 ID 可能会改变,所以我需要修改它。

ErrorDocument 404 https://www.example.com/video.html#11

此外,我在 .htaccess 文件中有以下行,但它不起作用:

RewriteRule ^([^\.]+)$ .html [NC,L]
https://www.example.com/video.html%11

您可以重定向这个(和类似的)URLs 以将 % 替换为 #,使用 mod_rewrite 规则顶部的 .htaccess 文件:

RewriteCond %{THE_REQUEST} ^GET\s(/video\.html)%(\d+)\s
RewriteRule . %1#%2 [NE,R=302,L]

THE_REQUEST 包含请求的第一行 headers,未解码,并且不受其他重写的影响。

substitution字符串中的%1%2反向引用分别包含/video.html%符号后的数字.

需要 NE (noescape) 标志以防止 # 符号在响应中被 URL-encoded(如 %23)并被解释作为 URL-path.

的一部分

然而,这还有更多的复杂性,因为它取决于您在 % 之后期望的 ID 号。 %NN(前 2 位数字)在 URL 中显然被视为 % 编码字符。 浏览器会在发出请求前将一些这些%编码字符转换回文字字符,因此%NN可能无法到达你的服务器。值得注意的是,这会影响标准拉丁字符 %61(a) 到 %86(z)、数字、大写字母等

例如,给定 /video.html%61 的请求, 浏览器 可能会在发出请求之前将其转换为 /video.htmla。在 .htaccess 中,这些将需要手动检查和转换,除非您有权访问服务器配置以创建 RewriteMap 以查找等效的 hex-codes。 (built-in escape() 函数仅 %-encodes 特殊字符 - 就像浏览器一样 - 所以它在这里不起作用。)

旁白: Windows 服务器上的另一个复杂问题是任何 % 编码的 characters that are not permitted in Windows filenames(例如. 代码 0-31,其中特别包括示例中的 %11(垂直制表符))将在 .htaccess 能够处理请求之前导致 403 Forbidden 响应。要解决此问题,您需要将此指令移动到主服务器配置(或 VirtualHost),以便在 映射到文件系统之前 处理请求。