無料レンタルサーバを使うと、.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内で
1 | $_SERVER [ "PATH_INFO" ] = '/?' . $_SERVER [ "QUERY_STRING" ]; |
と書き換えてしまいたいとこではある。
だが、意図しない振り分けされてしまい上手くいかなかったことは、ここに書いておく。
管理画面から設定変更
『設定』→『パーマリンク設定』にて『カスタム構造』で下記を指定する。
1 | /?/%postname%/ |
pathinfoぽい値をurlパラメータで振り直す設定
getパラメータで渡されたものを、path_infoで渡されたと内部的に認識させる。
/index.php
頭に追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | if ( strstr ( $_SERVER [ "REQUEST_URI" ], '?s=' )) { // 検索 // リダイレクト $set_url = htmlentities( $_REQUEST [ 's' ],ENT_QUOTES, "UTF-8" ); $set_url = str_replace ( " " , "_" , $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 = 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で返しておく。
修整後は下記の様な形になる。
1 2 3 4 5 | 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/』に変更しておく
1 2 3 4 5 6 7 8 9 10 | $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
1 | $permalink = $wp_rewrite ->get_feed_permastruct(); |
を
1 | $permalink = '' ; // パラメータ式 |
とすればプログラムとしては動くようにはなるが
無料サーバでお約束の自動広告のせいで、XML形式エラーにされてしまうので、結局使えない。
推奨しないこと
処理が重くなりがちで『High load CGI detected.』が起きうるので、使わない方がいい。
- moreタグを多用する
- 親があるカテゴリを作る
コメント