如何通过 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),以便在 映射到文件系统之前 处理请求。
我们网站的链接是这样的:
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),以便在 映射到文件系统之前 处理请求。