Arabic permalink not found

时间:2016-11-04 作者:Peter Wilson

我在阿拉伯语wordpress网站上工作,在使用阿拉伯语标题发表文章时遇到了一个问题。单个贴子页面总是重定向到404页面,但使用英语permalinks,它可以完美地工作

当我尝试使用the_permalink(); 它返回:

http://a3lamy.com/%d8%aa%d8%ac%d8%b1%d8%a8%d8%a9/
在wordpress admin dashboard中编辑帖子时,永久链接如下所示:

http://a3lamy.com/تجربة/
数据库服务器排序规则为utf8_general_ci

打开wp posts表时,我发现帖子名称为:

%d8%aa%d8%ac%d8%b1%d8%a8%d8%a9
当我手动更改它时تجربة 但permalink仍然重定向到404 not found页面!

我的网站。配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="WordPress Rule" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
任何帮助都将不胜感激。

2 个回复
SO网友:SOAL ABDELDJALLIL

此问题是由于IIS无法识别多语言URL,

您需要在wp配置的末尾添加以下代码。php文件:

if ( isset($_SERVER[\'UNENCODED_URL\']) ) {
$_SERVER[\'REQUEST_URI\'] = $_SERVER[\'UNENCODED_URL\'];}

SO网友:Tom J Nowell

这是因为你想要的是不可能的,RFC说URL必须是ANSI字符的子集,其中包括拉丁a-Z字符、数字和符号的子集。没有Unicode URL这样的东西,它与您的数据库编码无关,WordPress正在完成它的工作,这是预期的行为。

http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

“…仅字母数字[0-9a-zA-Z],特殊字符“$-\\.+!*”(),“[不包括引号-ed]和用于保留目的的保留字符可以在URL中未编码使用。”

然而,并非每个国家都说美国英语,因此我们有RFC3986:http://www.faqs.org/rfcs/rfc3986.html

Wikipedia 表示:

虽然URI仅限于ASCII字符集的子集,但IRIs可能包含通用字符集(Unicode/ISO 10646)中的字符,包括中文或日文汉字、韩文、西里尔文字符等。

语法

IRI通过使用通用字符集对URI进行扩展,而URI仅限于ASCII,字符数少得多。虹膜可以用八位字节序列来表示,但定义为字符序列,因为虹膜可以用手说或写。2 这就是URL处理外来非ANSI字符的方式。因为URL只支持ANSI的子集,所以必须对非拉丁字符进行编码。

这不太好,但原来的HTTP规范不能处理非英语字符,这就是他们用来绕过这一点的黑客。同样的事情也会发生在汉字、表情符号和其他非英语字母上

一个实验,如果我创建一个名为

edit screen

然后访问以下页面:

the page

所有内容看起来都是正确的,但如果我复制粘贴URL,我会得到以下结果:

https://tomjn.com/%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9/
哪个是https://tomjn.com/تجربة/ 编码为URL

%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9是一组阿拉伯字符,其中每个%编码的八位字节表示通用字符集中的字符代码

这是预期的行为,以及它应该如何工作,并在所有支持国际化URL和域的浏览器和HTTP应用程序中实现

原因the_permalink 这是因为它通过esc_urlurlencode, 但是,如果您删除了它,并将其按原样输出到页面上,它不会改变任何事情,因为浏览器会在用户端自动执行。如果没有,那么您最终将得到一个无法正常工作的损坏的HTTP请求。

那么404是从哪里来的呢

如果进入数据库并手动将slug更改为تجربة 那么WordPress将永远无法找到它。浏览器将其更改为%d8%aa%d8%ac%d8%b1%d8%a8%d8%a9, 然后,WP将在数据库中搜索。但它找不到,因为它已更改为تجربة

相关推荐

Force pretty permalinks?

我正在构建一个插件,该插件将用于单个站点,并依赖于add_rewrite_rule 要工作,需要打开永久链接。打开它们并不困难,因为它只是一个站点,但我担心其中一个管理员可能会在不知道自己在做什么的情况下关闭它,并破坏该站点。如何以编程方式强制保持漂亮的永久链接?