我需要从URL中删除空格以与网站兼容给定:
https://example.com/About Resting Days.pdf
退货:第一次仅适用于第一个示例。它似乎需要循环
ijnw1ujt1#
RewriteRule ^([^\s%20]*)(?:\s|%20)+(.*)$ $1$2 [L,R]
这将“循环”--但它将触发外部重定向“循环”,直到所有空格都被替换(如果URL中有两个以上空格,这当然是不可取的)。然而,此规则还有其他“错误”:
RewriteBase
[^\s%20]
%
2
0
%20
RewriteRule
关于“循环”...您可以通过内部重写(与外部重定向相反)迭代删除所有空格,并且仅在删除所有空格后才发出外部重定向。例如,在根.htaccess文件的顶部,尝试执行以下操作:
.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)匹配任何非空格字符。根据你的例子,我做了一些额外的假设:
N
\s
s
\S
S
话虽如此,如果你的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]
1条答案
按热度按时间ijnw1ujt1#
这将“循环”--但它将触发外部重定向“循环”,直到所有空格都被替换(如果URL中有两个以上空格,这当然是不可取的)。然而,此规则还有其他“错误”:
RewriteBase
指令。[^\s%20]
-字符类中的%
、2
和0
字符被视为单独的文字字符。它不是%20
(编码为 space 的URL)。RewriteRule
pattern 匹配%解码的URL路径,因此尝试匹配%20
是多余的(除非请求的URL是双重URL编码的)。关于“循环”...您可以通过内部重写(与外部重定向相反)迭代删除所有空格,并且仅在删除所有空格后才发出外部重定向。
例如,在根
.htaccess
文件的顶部,尝试执行以下操作:第一个规则会比对包含 * 多于 * 1 * 个空格 * 的URL,并移除第一个空格。
N
旗标会让重写引擎立即重新启动(实际上是递归循环),传回重写的URL。然后会重新行程规则,直到移除最后一个空格以外的所有空格为止。然后,第二个规则匹配仅包含1个空格(如果已触发前一个规则,则为最后一个空格)的URL,并立即触发外部重定向以删除最后一个空格。
\s
(小写s
)速记字符类匹配任何 * 空格 * 字符。而\S
(大写S
)匹配任何非空格字符。根据你的例子,我做了一些额外的假设:
话虽如此,如果你的URL最多只包含几个空格,那么你可以分别硬编码5,4,3,2和1 * 空格 * 的规则。例如: