特殊字符和URL重写(Special Characters & URL Rewriting)

2019-09-21 15:32发布

我目前的工作,从暴雪社区API拉JSON数据,并与PHP解析它的应用程序。 我到了那里,在他们的名字一个特殊字符的字符,一切工作正常。

为了拉动字符的数据,我需要知道自己的角色名称和领域,他们都在。

我通过URL字符页面传递的名称和领域,并从那里使用该信息来拉字符数据。

在这一点上我的网址是像这样:

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

在这一点上,如果我尝试提取数据用于与口音我得到重新定向到我的错误页面,因为它不是一个有效的字符的字符。

但直到我开始URL重写,我发现我的问题。 我被重新定向到我的错误页面,因为沿线的特殊字符被替换为一些非常靠不住的字符地方。

与我的新的URL重写后续工作:

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

然而,在他们的名字一个特殊字符的字符会导致错误消息。

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

结果在下面的错误消息:

“未找到

所请求的URL / guildtree /银色黎明/notúk在此服务器上找到。”

正如你可以看到U是被取代ú,但是当我复制并粘贴URL将U显示为%C3%BA

这是我的理解是为什么U是表现为ú的原因是因为两个字节的Unicodeú被压扁成导致ú显示两个一个字节的ASCII字符。

我已确保我所有的页面都在标题下面:

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

为了让我的应用程序才能正常工作,我需要这些特殊字符能正确显示,所以我需要在U实际显示为U,不会出现ú但实际上是ú或%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 /银色黎明/notúk在此服务器上找到。”

我认为,现在的主要问题是与URL重定向,因为JSON数据可以分析完全正常,当有重音符号。 我只是不明白为什么它一直显示我,这是对guildtree /银色黎明在浏览器栏/notúk,而是不停地尝试拉/ guildtree /银色黎明/notúk。

Answer 1:

U是不是一个有效的字符,对于一个网址。

无论你链接的用户名,你应该URL编码它。

因此,正确的URL指向是:

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

您应该打印在PHP为:

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


Answer 2:

我想这个问题可能有你的答案。 我还没有尝试过这个自己,但是从我所看到的,你需要重写你的重写规则为:

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

B标志将确保特殊字符的网址转义,所以在$ 2中的名称所见的价值将是百分之编码。 既然你是不是做一个重定向,原来的Unicode字符仍然应该是什么显示的URL。

您还需要一些改变,正则表达式,以确保它的Unicode字符匹配。 我不知道这些东西会。

也有如何多一些描述Unicode字符的URL中的在这里工作 。



Answer 3:

为了得到这个正常工作,你需要做两件事情。

首先添加到您的.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]

这将导致一些重定向循环为其他页面,但我工作的那个固定的时刻。



文章来源: Special Characters & URL Rewriting