無料レンタルサーバを使うと、.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タグを多用する
- 親があるカテゴリを作る
コメント