無料レンタルサーバを使うと、.htaccessが使えないことがある。
そもそもmod_rewrite.cが入ってなかったりすることがある。
そんなサーバでのWordPressでパーマリンク構造の擬態をする方法をメモする。
今回は仮に『buttobi.net』を使う前提とする。
『パーマリンク設定』で下記を指定すれば
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タグを多用する
- 親があるカテゴリを作る

コメント