IIS 10 + MediaWiki:短 URL 的编码错误

问题描述 投票:0回答:1

我正在本地网络中的 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

mediawiki urlencode
1个回答
0
投票

经过几个月的徘徊,我找到了解决方法:

  1. https://www.mediawiki.org/wiki/Topic:Rwbeswv4deqbzlvn所示,在
    LocalSettings.php
    中添加以下行:
$_SERVER['REQUEST_URI'] = urlencode($_SERVER['REQUEST_URI']);
  1. 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>

© www.soinside.com 2019 - 2024. All rights reserved.