特殊字符& URL重写

时间:2012-08-24 14:41:28

标签: php regex apache .htaccess url-rewriting

我目前正在开发一个应用程序,它从暴雪社区API中提取JSON数据并使用PHP解析它。一切都运转正常,直到我找到一个名字中带有特殊字符的角色。

为了提取字符数据,我需要知道它们所在的字符名称和领域。

我将名称和领域通过URL传递给角色页面,然后使用该信息来提取角色数据。

此时我的网址是这样的:

 http://localhost/guildtree/characters.php?realm=argent-dawn&name=Ankzu

此时如果我尝试为具有重音的字符提取数据,我会重新定向到我的错误页面,因为它不是有效的字符。

直到我开始重写URL才发现我的问题。我被重新定向到我的错误页面,因为在某个地方,特殊字符正在替换一些非常不稳定的字符。

使用我的新重写网址后续工作:

 http://localhost/guildtree/argent-dawn/ankzu

但是,名称中包含特殊字符的字符会导致错误消息。

 http://localhost/guildtree/argent-dawn/notúk

导致以下错误消息:

“找不到”

在此服务器上找不到请求的URL / guildtree / argent-dawn /notúk。“

正如你所看到的那样,ú正在取代ú,但当我复制并粘贴网址时,ú显示为%C3%BA

据我所知,ú出现的原因是因为两个字节的unicodeú被压缩成两个一个字节的ASCII字符,导致显示ú。

我确保我的所有网页在标题中都有以下内容:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

为了让我的应用程序正常工作,我需要正确显示这些特殊字符,所以我需要ú实际显示为ú,而不是显示为ú但实际上是º或%C3%BA。

字符名称将从URL中提取为:

$charName = $_GET['name'];

是否可以编码$ charName以正确显示特殊字符?

我已经尝试了我能想到的所有内容并在谷歌上搜索过但没有任何效果。

另外,因为我正在使用URL重写,重写规则允许这些特殊字符是什么?

这是我目前的重写规则:

 RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$        characters.php?realm=$1&name=$2     [NC]

我知道([a-zA-Z] +)根本不允许特殊字符,我目前一直在努力让特殊字符正确显示。如果我使用([a-zA-Z \º] +)它将工作并显示需要显示的页面。将“Ô添加到规则似乎是一种非常糟糕的方法,并且在使用重音字符的相应字符时并不总是有效。

非常感谢任何帮助。如果您需要更多信息,请询问。

编辑:

将重写规则更改为以下内容可以很好地提取信息,但会为我的CSS创建重定向循环。

 RewriteRule ^([a-zA-Z0-9_'-]+)/([^/]+)$        characters.php?realm=$1&name=$2 [NC]

例如,我的CSS被重定向到

http://localhost/guildtree/css/error

而不是

http://localhost/guildtree/css/style2.css

更新

通过一些简单的测试:

$charName = $_GET['name'];
$charNameTEST = utf8_encode($charName);

将进行更改,但当我将其应用到我的页面时,它仍然会出现:

“找不到”

在此服务器上找不到请求的URL / guildtree / argent-dawn /notúk。“

我认为现在的主要问题是URL重定向,因为当JSON数据具有重音字符时,它可以被完全解析。我只是不明白为什么它一直向我显示它在浏览器栏中的guildtree / argent-dawn /notúk,但一直试图拉起/ guildtree / argent-dawn /notúk。

3 个答案:

答案 0 :(得分:3)

对于URL,

ú不是有效字符。

无论您在何处链接用户名,都应对其进行网址编码。

因此指向的正确URL是:

http://localhost/guildtree/argent-dawn/not%C3%BAk

你应该在php中打印它:

echo '<a href="http://localhost/guildtree/argent-dawn/'. urlencode($name) .'">Link</a>;

答案 1 :(得分:2)

我认为this question可能有你的答案。我有尝试过这个,但从我所看到的,你需要重写你的RewriteRule:

RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$        characters.php?realm=$1&name=$2     [NC,B]

B 标志将确保特殊字符被URL转义,因此$ 2中的名称所显示的值将是百分比编码。由于您没有进行重定向,原始的unicode字符应该仍然是URL中显示的内容。

您还需要对正则表达式进行一些更改,以确保它与unicode字符匹配。我不确定那些会是什么。

还有一些关于如何unicode characters work in URLs over here的更多描述。

答案 2 :(得分:2)

要使其正常工作,您需要做两件事。

首先将其添加到.htaccess

AddDefaultCharset On
AddDefaultCharset UTF-8
AddCharset UTF-8 .tpl
AddCharset UTF-8 .js
AddCharset UTF-8 .css
AddCharset UTF-8 .php

其次,将需要允许特殊字符的重写规则部分更改为(。*),如下所示:

 RewriteRule ^([a-zA-Z0-9_'-]+)/(.*)$       characters.php?realm=$1&name=$2     [NC]

这将导致其他页面的某些重定向循环,但我正在努力修复此问题。

相关问题