【问题标题】:Redirection rules with special characters带有特殊字符的重定向规则
【发布时间】:2012-02-18 15:09:45
【问题描述】:

我想使用重定向 301 规则(即我希望能够避免重写规则)来重定向包含特殊字符(如 é、à、...)的 URL,例如

重定向 301 /éxàmple http://mydomain.com/example

但是,简单地添加它是行不通的。有什么建议?

【问题讨论】:

  • 您是否尝试过 URL 编码,或以任何其他方式转义字符(例如 \x0NNN)?您是否使用正确的编码(UTF-8、ISO-xxxx、...)保存了文件?
  • 我确实尝试过使用 URL 编码,即使用 %E1 而不是 á 等等。我还使用 UTF-8 保存了文件,但重定向规则没有触发
  • 按照您的建议(并从 .htaccess 的旧备份副本开始以避免编码冲突),我设法使所有带有重音符号的规则都可以工作,但包含 à 字符的规则除外。很难理解为什么像 é 这样的字符起作用而不是 à。想法?

标签: apache .htaccess internationalization http-status-code-301 url-encoding


【解决方案1】:

如何在 Windows 系统上解决此问题

在 Windows 上,您可以使用 Notepad++ 正确输入 Unicode 字符。启动 Notepad++ 后,从“编码”菜单中选择“在没有 BOM 的 UTF-8 中编码”,然后输入您的 Unicode 字符并保存文件。

为确保字符已正确保存,请下载适用于 Windows 的十六进制编辑器,并确保将 é 保存为 c3 89,将 à 保存为 c3 a0

我假设您在 Linux 系统上的先前回复

很可能 Unicode 字符没有正确保存在 .htaccess 文件中。

当你尝试这个命令时你会得到什么:

grep -o .x.mple .htaccess | od -t x1 -c

如果你的 Unicode 字符被正确保存,你应该得到这个。

0000000  c3  a9  78  c3  a0  6d  70  6c  65  0a  65  78  61  6d  70  6c
        303 251   x 303 240   m   p   l   e  \n   e   x   a   m   p   l
0000020  65  0a
          e  \n
0000022

如果您安装了xxdhd,您可以获得更简洁的输出来进行故障排除:

$ grep -o .x.mple .htaccess | xxd -g1
0000000: c3 a9 78 c3 a0 6d 70 6c 65 0a 65 78 61 6d 70 6c  ..x..mple.exampl
0000010: 65 0a                                            e.

在所有输出中,您可以看到é 保存为二进制数:c3 89。从http://www.fileformat.info/info/unicode/char/e9/index.htm 可以看出,é 在 UTF-8 编码时确实是两个字节:0xC3 和 0xA9。

同样,à UTF-8 格式为:0xC3 0xA0。见http://www.fileformat.info/info/unicode/char/e0/index.htm。您也可以在输出中看到这些代码。

【讨论】:

  • 我在 windows 下使用 Apache。我已将文件的编码更改为 Unicode,但现在出现内部服务器错误
  • 您是如何将文件的编码更改为 Unicode 的?您在对文件进行编码时选择了哪种 Unicode 格式?是 UTF-8 吗?
  • 是的,它现在是 utf-8。我已经使用记事本++更改了编码,现在我没有收到错误,但重定向规则尚未触发
  • 我可以在我的 Windows XP 笔记本电脑上重现这种情况,它对我来说非常有用。我建议您使用 Notepad++ 从头开始​​创建 .htaccess,并将您的编码设置为“UTF-8 without BOM”。这只是为了确保您重新开始,并且您没有在过去犯过任何错误。
  • 出于故障排除目的,请确保 httpd.conf 中相应的 Directory 条目具有 AllowOverride All。您应该能够通过在 httpd.conf 中搜索“.htaccess”来找到该指令。另外,请确保您在 httpd.conf 中有 LoadModule alias_module modules/mod_alias.so
【解决方案2】:

这些应该可以工作,但这取决于您必须检查的一些事项:

  • 您是否启用了 mod_alias?如果没有,你应该运行a2enmod mod_alias
  • 您是否有重定向到您的example 页面? (在别名之前应用重定向)

然后,除了将其转换为 UTF-8 之外,您可以尝试将字符按照浏览器编码的方式放置,例如 %C3%A9 表示 é 等。

【讨论】:

  • %C3%A9 不起作用,因为 Apache 会在处理请求之前将其转换回 é
  • %s 进行双重编码怎么样?例如%25C3%25A9
猜你喜欢
  • 2019-01-05
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
相关资源
最近更新 更多