4

我正在开发一个网站,让人们可以创建自己的翻译器。他们可以选择 URL 的名称,并将其发送到数据库,我使用 .htaccess 进行重定向website.com/nameoftheirtranslator

至:

website.com/translator.php?name=nameoftheirtranslator

这是我的问题:

最近,我注意到有人创建了一个名称中带有特殊字符的翻译器 -> “LAEFÊVËŠI”。

但是当它被处理(发布到一个 php 文件,然后mysqli_real_escape_string)并添加到数据库时,它显示为简单的“LAEFVI” - 所以你可以看到特殊字符在某个地方丢失了。

我不太确定在这里做什么,但我认为有两条路径:

  1. 尝试保留字符并进行一些编码(不知道从哪里开始)
  2. 抛弃他们并告诉用户在他们的翻译名称中只使用“正常”字符(不理想)

我想知道是否有可能有一个类似的网址website.com/LAEFÊVËŠI- 服务器可以解释它吗?

EDIT1:我注意到堆栈溢出,在这个问题上,将我标题中的特殊字符翻译为.../using-special-characters-in-urls!这似乎是一个很好的解决方案,我想我可以创建一个函数,将 â 之类的特殊字符转换为它们的正常等效字符(如 â)?而且我想我会忽略其他角色,例如/#@"',&?现在我想到了,必须有一些相当标准/良好实践的策略来解决这样的问题。

EDIT2: 实际上,现在我考虑了一下(更多) - 我真的希望这个东西可以被任何语言(不仅仅是英语)的人使用,所以我真的很希望能够在网址中包含特殊字符。话虽如此,我刚刚发现谷歌不解释â为,所以如果我不将字母翻译成普通字符a,人们可能很难找到翻译。LAEFÊVËŠI啊!

4

1 回答 1

1

好吧,在那段疯狂的插曲之后,发生了以下事情:

  • 发现我正在使用 PHP 删除所有非字母数字字符preg_replace()
  • 已更改preg_replace,因此它仅删除空格并使用rawurlencode()

$name = mysqli_real_escape_string($con, rawurlencode( preg_replace("/\s/", '', $name) ));

  • 现在一切都在数据库中编码,安全可靠。
  • 使用了这个重写规则RewriteRule ^([^/.]+)$ process.php?name=$1 [B]
  • 在圈子里跑了 2 个小时,以为我的重写是错误的,因为我得到“找不到页面”
  • 意识到process.php没有rawurlencode()阅读name

$name = rawurlencode($_GET['name']);

现在它起作用了。

哇!

睡觉时间。

于 2013-06-27T17:02:28.093 回答