1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MediaWiki + Short URL + IIS で日本語の URL が文字化けしてしまう

Posted at

環境

  • MediaWiki 1.25.1
  • IIS 8.0(Microsoft Azure WebApps[旧WebSites])
  • PHP5.4.42
  • URL Rewrite

現象

https://www.mediawiki.org/wiki/Manual:Short_URL/IIS7 を参考に、 Short URLの設定をしたところ、一部の日本語URLが文字化けしてしまう事象が発生

例)
http://example.com/wiki/あ
↓ 特定の文字が以下のように文字化けしてしまう
http://example.com/wiki/Ã

原因

MediaWiki の WebRequest::getPathInfo() で、 $_SERVER['REQUEST_URI'] からタイトルを抽出しようとした際、 parse_url() 関数に URLエンコードされていないマルチバイト文字列が渡ってしまい、 parse_url() 関数の結果が文字化けしてしまう。

対応方法

parse_url() 関数に、 URLエンコードされた文字列を渡すようにする。
根本的には、 IIS + URLRewrite が生成する $_SERVER['REQUEST_URI'] に、 URLエンコードされていない文字列が出力されてしまうのが問題だが、これを回避するために、 $_SERVER['UNENCODED_URL'] が取得できる場合は、こちらを利用する。

修正パッチ

--- a/includes/WebRequest.php
+++ b/includes/WebRequest.php
@@ -94,7 +94,12 @@ class WebRequest {
 		$matches = array();
 		if ( !empty( $_SERVER['REQUEST_URI'] ) ) {
 			// Slurp out the path portion to examine...
-			$url = $_SERVER['REQUEST_URI'];
+			if (!empty($_SERVER["UNENCODED_URL"])) {
+				$url = $_SERVER["UNENCODED_URL"]; // for Microsoft Azure
+			} else {
+				$url = $_SERVER['REQUEST_URI'];	
+			}
+
 			if ( !preg_match( '!^https?://!', $url ) ) {
 				$url = 'http://unused' . $url;

TODO

  • MediaWiki にバグレポートを出そうと思うが、 Gerret の使い方を勉強しなくてはならない...
1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?