特殊字符和URL重写

aka*_*ari 7 php regex apache .htaccess url-rewriting

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

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

我有名称和领域通过URL传递到字符页面,并从那里使用该信息来提取字符数据.

此时我的网址如下:

 http://localhost/guildtree/characters.php?realm=argent-dawn&name=Ankzu
Run Code Online (Sandbox Code Playgroud)

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

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

使用我的新重写URL,以下工作:

 http://localhost/guildtree/argent-dawn/ankzu
Run Code Online (Sandbox Code Playgroud)

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

 http://localhost/guildtree/argent-dawn/notúk
Run Code Online (Sandbox Code Playgroud)

导致以下错误消息:

"未找到

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

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

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

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

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Run Code Online (Sandbox Code Playgroud)

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

正在从URL中提取字符名称,如下所示:

$charName = $_GET['name'];
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试了所有我能想到的并在Google上搜索但没有任何效果的东西.

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

这是我目前的重写规则:

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

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

任何帮助将不胜感激.如果您需要更多信息,请询问.

编辑:

将我的重写规则更改为以下允许信息被拉得很好,但为我的CSS创建了一个重定向循环.

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

例如,我的CSS被重定向到

http://localhost/guildtree/css/error
Run Code Online (Sandbox Code Playgroud)

代替

http://localhost/guildtree/css/style2.css
Run Code Online (Sandbox Code Playgroud)

更新:

通过几个简单的测试:

$charName = $_GET['name'];
$charNameTEST = utf8_encode($charName);
Run Code Online (Sandbox Code Playgroud)

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

"未找到

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

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

Joc*_*ung 3

对于 URL,\xc3\xba 不是有效字符。

\n\n

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

\n\n

因此,正确的 URL 指向是:

\n\n
http://localhost/guildtree/argent-dawn/not%C3%BAk\n
Run Code Online (Sandbox Code Playgroud)\n\n

你应该在 php 中将其打印为:

\n\n
echo \'<a href="http://localhost/guildtree/argent-dawn/\'. urlencode($name) .\'">Link</a>;\n
Run Code Online (Sandbox Code Playgroud)\n