0

在我的 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 做了一些测试,但卡住了。

谢谢!

4

2 回答 2

0

谢谢@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下载/

于 2013-06-11T07:44:38.330 回答
0

据我了解, 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]应该重新运行所有重写规则,这将删除任何剩余的软连字符。

于 2013-06-10T15:59:17.090 回答