400 Bad Requestを.htaccessでは処理できない

WordPressで日本語URLを使っている場合、URLが以下のようになります。

http://takahitokikuchi.poitan.net/2013/05/30/%E3%83%AA%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%88%E3%82%AB%E3%83%BC%E3%83%89%E3%83%97%E3%83%A9%E3%82%B9%EF%BC%88jcb%EF%BC%89%E3%82%92%E7%94%B3%E3%81%97%E8%BE%BC%E3%81%BF/

%E3%83のようになり、この%**の問題で、「400 Bad Request」と表示されるということを書いたことがあります。これは、リンク自体を修正することでエラーにならないようにしましたが、外部のリンクの場合はリンクを修正することはできません。

400 Bad Requestの場合はトップにでもリダイレクトすれば良いと思い、.htaccessに以下のように記述しました。404などではよくやるパターンですよね。

ErrorDocument 400 /400.php

これで、400.phpでトップページにリダイレクトすればOKだと思いましたが、思っているように動いてくれません。色々悩んだ所、400 Bad Requestの場合は.htaccessでは対応できないのでは?と思い、httpd.confのVirtualHostに上記の記述を入れました。これで、400.phpにアクセスされました。

400.phpにアクセスできれば、トップページではなく、URLの形式を戻してからリダイレクトすれば良いため、400.phpを以下のようにします。%+1文字で終了している、または%で終わっている場合はそれを削除、という処理です。

<?php
$url = preg_replace ('/(%[a-f0-9]{1}|%)+$/i', '', $_SERVER["REQUEST_URI"]);
header ("HTTP/1.1 301 Moved Permanently");
header ("Location: " . $url);
exit;
?>

一応、これで動作しています。

  • このエントリーをはてなブックマークに追加
  • Check
  • 「ポイント・マイル」ブログランキング参加中
  • にほんブログ村 小遣いブログ マイレージへ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください