在我的 http 日志中,我看到:“GET /category/f%C2%ADile-to-download/HTTP/1.1”301 而不是“GET /category/file-to-download/HTTP/1.1”200 我发现 %C2 %AD 是软连字符(不可见符号)。
我需要检查对 Apache 的查询是否包含软连字符以及是否删除它。关于找到软连字符并将其删除的最佳方法有什么建议吗?我用 RewriteRule 做了一些测试,但卡住了。
谢谢!
在我的 http 日志中,我看到:“GET /category/f%C2%ADile-to-download/HTTP/1.1”301 而不是“GET /category/file-to-download/HTTP/1.1”200 我发现 %C2 %AD 是软连字符(不可见符号)。
我需要检查对 Apache 的查询是否包含软连字符以及是否删除它。关于找到软连字符并将其删除的最佳方法有什么建议吗?我用 RewriteRule 做了一些测试,但卡住了。
谢谢!
谢谢@icabod
目前我在我的情况下得到了这个规则:
RewriteCond %{REQUEST_URI} \xc2\xad [NC]
RewriteRule ([^\xc2\xad]*)[\xc2\xad]+([^\xc2\xad]*) /$1$2 [N,R=301,L,NC]
.htaccess 应该是 UTF-8 格式,如上所述。
R=301
- 使用 HTTP 代码 301 重定向
NC
- 不区分大小写 但它不适用于 URL 不同位置的两个软连字符,如下所示:
/category/f%C2%ADile-to-d%C2%AD下载/
据我了解, mod_rewrite 使用un-escaped characters,因此为了让您正确匹配软连字符然后将其删除,您需要以UTF-8.htaccess
编码编辑和保存文件(大多数现代编辑器都会这样做)。
然后,您需要在规则中输入软连字符。以下将(应该!?)从您的输入中删除一个软连字符,但如前所述,它依赖于 UTF-8 格式的文件:
RewriteRule ([^-]*)-([^-]*) $1$2
请注意,您需要将 替换为-
实际的 UTF-8 破折号。
也许更简单的选择是:
RewriteRule ([^\xc2\xad]*)\xc2\xad([^\xc2\xad]*) $1$2 [N]
它使用您看到的特定 UTF-8 代码将其从字符串中删除。[N]
应该重新运行所有重写规则,这将删除任何剩余的软连字符。