.htaccess 使用htaccess删除URL中空格

zzzyeukh  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(133)

我需要从URL中删除空格以与网站兼容
给定:

https://example.com/About Resting Days.pdf

退货:
第一次
仅适用于第一个示例。它似乎需要循环

ijnw1ujt

ijnw1ujt1#

RewriteRule ^([^\s%20]*)(?:\s|%20)+(.*)$ $1$2 [L,R]

这将“循环”--但它将触发外部重定向“循环”,直到所有空格都被替换(如果URL中有两个以上空格,这当然是不可取的)。然而,此规则还有其他“错误”:

  • 替换字符串上没有斜杠前缀,因此将导致格式错误的重定向,除非您还定义了相应的RewriteBase指令。
  • [^\s%20]-字符类中的%20字符被视为单独的文字字符。它不是%20(编码为 space 的URL)。
  • RewriteRulepattern 匹配%解码的URL路径,因此尝试匹配%20是多余的(除非请求的URL是双重URL编码的)。

关于“循环”...您可以通过内部重写(与外部重定向相反)迭代删除所有空格,并且仅在删除所有空格后才发出外部重定向。
例如,在根.htaccess文件的顶部,尝试执行以下操作:

RewriteRule ^(\S+)\s(\S+\s.+)$ $1$2 [N]
RewriteRule ^(\S+)\s(\S+)$ /$1$2 [R=302,L]

第一个规则会比对包含 * 多于 * 1 * 个空格 * 的URL,并移除第一个空格。N旗标会让重写引擎立即重新启动(实际上是递归循环),传回重写的URL。然后会重新行程规则,直到移除最后一个空格以外的所有空格为止。
然后,第二个规则匹配仅包含1个空格(如果已触发前一个规则,则为最后一个空格)的URL,并立即触发外部重定向以删除最后一个空格。
\s(小写s)速记字符类匹配任何 * 空格 * 字符。而\S(大写S)匹配任何非空格字符。
根据你的例子,我做了一些额外的假设:

  • URL路径不以空格开始或结束。(虽然我不确定URL路径是否可以以空格结束?)
  • 只有一个空格,中间穿插着非空格字符。即,没有一个以上空格的连续序列。

话虽如此,如果你的URL最多只包含几个空格,那么你可以分别硬编码5,4,3,2和1 * 空格 * 的规则。例如:

RewriteRule ^(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)$ /$1$2$3$4$5$6 [R,L]
RewriteRule ^(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)$ /$1$2$3$4$5 [R,L]
RewriteRule ^(\S+)\s(\S+)\s(\S+)\s(\S+)$ /$1$2$3$4 [R,L]
RewriteRule ^(\S+)\s(\S+)\s(\S+)$ /$1$2$3 [R,L]
RewriteRule ^(\S+)\s(\S+)$ /$1$2 [R,L]

相关问题