我正在本地网络中的 Windows Server 2016(语言设置为韩语)上运行 MediaWiki。我按照MediaWiki手册启用短网址,结果如下:
A.
대문
¹ 变为 ´ë¹®
并且无法通过其短 URL 访问。
B.
媛곴컖
变为 각각
。² 媛곴컖
的链接指向 http://192.168.0.123/wiki/媛곴컖
(或 http://192.168.0.123/wiki/%E5%AA%9B%EA%B3%B4%EC%BB%96
),单击时会显示页面 각각
的内容。
在这两种情况下,它们的完整 URL(如
http://192.168.0.123/w/index.php?title=%EB%8C%80%EB%AC%B8
)都可以完美运行 99%³。
经过一些调查,我发现存在一些编码问题。
(A)
EB 8C 80 EB AC B8
↓ Decoded with UTF-8
대문
↓ Encoded with EUC-KR
B4 EB B9 AE
↓ Decoded with Latin-1
´ë¹®
(B)
E5 AA 9B EA B3 B4 EC BB 96
↓ Decoded with UTF-8
媛곴컖
↓ Encoded with EUC-KR
EA B0 81 EA B0 81
↓ Decoded with UTF-8
각각
EUC-KR 似乎参与了 URL 编码/解码过程的某些点,但我在 IIS 或 MediaWiki 设置中找不到任何设置。
¹ 韩语中“主页”的意思
²
媛곴컖
是각각
的mojibake,在韩语中是“每个”的意思。但在这种情况下,意义本身并没有意义。
³ 剩下的 1% 是可视化编辑器将类别链接替换为其完整 URL,例如
Category:Foo
至 Category:index.php?title=Foo
。
经过几个月的徘徊,我找到了解决方法:
LocalSettings.php
中添加以下行:$_SERVER['REQUEST_URI'] = urlencode($_SERVER['REQUEST_URI']);
web.config
中的重写规则中,替换
<action type="Rewrite" url="w/index.php?title={R:1}" logRewrittenUrl="true" />
与
<action type="Rewrite" url="w/index.php?title={UrlDecode:{R:1}}" logRewrittenUrl="true" />
现在一切正常。
工作
web.config
的完整来源如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" />
</system.web>
<system.webServer>
<handlers>
<remove name="PHP53_via_FastCGI" />
<remove name="PHP_via_FastCGI" />
<add name="PHP_via_FastCGI" path="*.php" verb="GET,HEAD,POST" modules="FastCgiModule" scriptProcessor="C:\php\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>
<rewrite>
<outboundRules>
<preConditions>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
<rules useOriginalURLEncoding="false">
<rule name="RewriteUserFriendlyURL1" enabled="true" stopProcessing="true">
<match url="^wiki/([^/]+/?[^/]*/?[^/]*)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="w/index.php?title={UrlDecode:{R:1}}" logRewrittenUrl="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>