mod_rewrite使えないサーバでWordPressパーマリンク構造モドキ

無料レンタルサーバを使うと、.htaccessが使えないことがある。
そもそもmod_rewrite.cが入ってなかったりすることがある。
そんなサーバでのWordPressでパーマリンク構造の擬態をする方法をメモする。

今回は仮に『buttobi.net』を使う前提とする。

『パーマリンク設定』で下記を指定すれば

http://XXX.jog.buttobi.net/%postname%/

http://XXX.jog.buttobi.net/index.php/YYY/
にアクセスすると
http://XXX.jog.buttobi.net/YYY/
の内容にアクセスできるはずなのだが、出来ない状態のサーバということ。

あくまでそれっぽい不完全な対応の方法なので、自己責任でどうぞ。
※これを試したのは結構突貫していた2010年くらい。今現在ならおそらく他に解決法あると思う。

現在の状態と対応方法

『index.php/YYY』ではアクセス出来ない。
だが『index.php/index.php?/YYY』としてしまえば、『?』以降はGETパラメータなのでアクセス可能。
つまり『GETパラメータを、pathinfo形式に擬態、認識させよう』という発想である。

『index.php』という文字自体は省略可能なので、URL的には下記の形になる。
http://XXX.jog.buttobi.net/?/YYY/
ぱっとみ違和感はない構造かと思う。

設定後しばらく放置してみたところ、Googleさんに期待通りに検索結果を反映いただけたことを確認した。
なので公開致した次第。

単純にwp-config.php内で

$_SERVER["PATH_INFO"] = '/?'.$_SERVER["QUERY_STRING"];

と書き換えてしまいたいとこではある。
だが、意図しない振り分けされてしまい上手くいかなかったことは、ここに書いておく。

管理画面から設定変更

『設定』→『パーマリンク設定』にて『カスタム構造』で下記を指定する。

/?/%postname%/

pathinfoぽい値をurlパラメータで振り直す設定

getパラメータで渡されたものを、path_infoで渡されたと内部的に認識させる。

/index.php

頭に追加。

if(strstr($_SERVER["REQUEST_URI"],'?s='))
{ // 検索
	// リダイレクト
	$set_url = htmlentities($_REQUEST['s'],ENT_QUOTES,"UTF-8");
	$set_url = str_replace(" ","_",$set_url);
	$set_url = 'http://'.$_SERVER['SERVER_NAME'].'?/s/'.$set_url;
	header("Location: ".$set_url);
}

$get_path = rawurldecode($_SERVER["QUERY_STRING"]);
$dir = explode('/', rtrim(ltrim($get_path,'/'),'/'));

if(isset($_GET[$get_path]))
{
	if(!isset($dir[$i+1]))
	{
		$_GET['name'] = $_REQUEST['name'] = $dir[0];
	}else
	{
		for($i=0; $i<count($dir); $i=$i+2)
		{
			if(!isset($dir[$i+1]))
			{
				$set_value = $dir[$i];
				// リダイレクト
				$set_url = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"];
				$set_url = str_replace("/".strtolower(rawurlencode($_GET[$set_name])),"",$set_url);
				header("Location: ".$set_url);
			}else
			{
				switch($dir[$i])
				{
					case 'page':
						$set_name = 'paged';
						break;
					case 'category':
						$set_name = 'category_name';
						break;
					default:
						$set_name = $dir[$i];
						break;
				}
				$set_value = $dir[$i+1];

				if($set_name=='s'){
					$set_value = str_replace("_"," ",$set_value);
				}
			}
			$_GET[$set_name] = $_REQUEST[$set_name] = $set_value;
		}
	}
}

redirectを防止

パラメータ名で指定した場合はpath_infoと取られて、
URLが想定と違うということでpath_infoなURLにリダイレクトされてしまうので、それを防止する修整。

/wp-includes/canonical.php

294行目。リダイレクトする前にfalseで返しておく。
修整後は下記の様な形になる。

if ( !redirect_canonical($redirect_url, false) ) {
	return false; // stop redirect
	wp_redirect($redirect_url, 301);
	exit();
} else {

ページリンク詐称

『/page/ページ数』とするために、ページ繰越が使えない。
それ用の対応。

/wp-includes/link-template.php

『/page/』になってしまうから『?/page/』に変更しておく

$query_string = '';
if ( $pagenum > 0 ) {
	$tmp = explode('/page/', $_SERVER["QUERY_STRING"]);
	$tmp = @reset($tmp);
	if(strlen($tmp)==0) {
		$tmp = '/';
	}
	$tmp_param = str_replace('//','/','?'.$tmp.'/page/');
	$request = ( ( !empty( $request ) ) ? trailingslashit( $request ) : $request ) . user_trailingslashit( $tmp_param . $pagenum, 'paged' );
}

もう少しうまく直せるとは思うが、動きはするので、今回はこれでいいことにした。
その辺は各々で対応してください。

日本語URLも可能だが、あまり推奨はしない。
urlencodeではなくてrawurlencodeの半角化したものだから
firefoxのアドレスバーで普通に日本語打ったんじゃ『urlencode』変換になるからアクセス出来なかったりするし。

※RSS用対応はwp-includes/link-template.php

	$permalink = $wp_rewrite->get_feed_permastruct();

	$permalink = ''; // パラメータ式

とすればプログラムとしては動くようにはなるが
無料サーバでお約束の自動広告のせいで、XML形式エラーにされてしまうので、結局使えない。

推奨しないこと

処理が重くなりがちで『High load CGI detected.』が起きうるので、使わない方がいい

  • moreタグを多用する
  • 親があるカテゴリを作る

コメント

タイトルとURLをコピーしました