【发布时间】:2020-05-03 19:04:12
【问题描述】:
我们在我们的网站上使用漂亮的网址。几年前,我让一名外部技术人员添加了反向链接。他做得很好,但在一种情况下,他始终添加一个带有尾随空格字符的链接。
https://www.example.com/item/item/%20
这已被编入索引为%20,我可以在我的反向链接报告中看到,有 87 个网站指向最后带有%20 的 URL。
如果我可以重定向它,那么我的页面/item/item/ 将获得 87 个反向链接。
我们使用重写规则,并且我已经尝试了所有解决堆栈溢出问题的方法,但都没有奏效。一些无效的解决方案是:
RewriteEngine on
RewriteRule ^(.*[^\ ])\ +$ /$1
RedirectRule (.*)\s$ $1 [R=301]
RewriteRule ^(.*/|)[\s%20]+(.+)$ $1$2
我尝试了重定向 301,但这些也不起作用。
redirect 301 /item/item/%20 /item/item/
redirect 301 /item/item/+ /item/item/
一些有用的东西 - 这不是一个网站范围的模式。它只是一个错误地传播到世界的特定 URL。它不是字符串中任何地方的空格 - 它总是在末尾。
谢谢。
我也可以将结尾的 %20 转换为已知字符,例如 - 因为我可以将其重定向 /item/item/- 到 item/item/
【问题讨论】:
-
您的服务器当前如何响应这些带有尾随 空格 的请求? 403禁止?这些 URL 是如何路由的?
/item/item/是完全虚拟的还是以某种方式与文件系统相关? -
它进入我们的 404 页面。需要明确的是,传入链接看起来像 /item/item/%20,这是我们网站上记录的内容。我认为让我感到困惑的是 htaccess 规则与已翻译的空格一起使用,并且在 htaccess 语法中,空格是分隔符。也不使用像 + 这样的普通 URL 编码。
-
“htaccess 规则适用于已翻译的空间” - 不一定。
RewriteRulepattern 匹配的 URL 路径是 %-decoded,但是,并非所有服务器变量都是。 “空格是分隔符” - 如果参数包含空格,那么您可以将整个参数括在双引号中(或反斜杠转义空格 - 正如您所做的那样,或在正则表达式中使用\s速记字符类)。 “也不使用像 + 这样的普通 URL 编码” -+(编码空间)仅适用于 URL 的查询字符串部分。在 URL 路径中,+是文字+(加号)。
标签: regex apache .htaccess mod-rewrite trailing