日本語込みのURLをRewriteRuleで書き換える2
2024/01/12
以前にメモをした「日本語込みのURLをRewriteRuleで書き換える」という内容をもうちょっと掘り下げたのでメモ。やりたいことは同様でWordPressのパーマネントリンク的なこと。
■やりたいこと
「http://hoge.com/あいうえお/」というURLを叩いた際に「http://hoge.com/index.php?param=あいうえお」に書き換える。
■htaccess例
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+)/$ index.php?param=$1 [L,QSA]
■解説
RewriteEngine On
書き換えを有効にする。Offだと無効。
RewriteBase /
書き換え後のパスのベース。下位ディレクトリに書き換えたい場合は「RewriteBase /sample」とかになる。お名前.comの共用サーバー(SDサーバー)の場合は必ずこれを設定する。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-dRwriteCondはRewriteRuleの適用条件。条件に適用した場合は書き換えを行い、適用しない場合は普通にアクセスさせるというもの。
「REQUEST_FILENAME」は変数で「!」は否定で「-f」「-d」はオプション。また、「-f」はフォルダが存在すればtrue、「-d」はディレクトリが存在すればtrueという意味。
なので「アクセスしてきたファイル名やディレクトリが存在しない場合はRewriteRuleを適用し、存在する場合は適用しない(普通にアクセスさせる)」という意味になる。
もしこれを書いておらず、「http://hoge.com/dir/」というディレクトリを作り、アクセスしようとすると「http://hoge.com/index.php?param=dir」に書き換えられてしまう。
RewriteRule (.+)/$ index.php?param=$1 [L,QSA]
文字列があった場合は「index.php?param=」の後にクエリとして渡される。[L,QSA]はオプションでLが「条件にマッチしたらそこで終了」、QSAは「別途クエリがあった場合は引き継ぐ」というもの。
まずLの方はちょっと良い例が思い浮かばなかったけれども、
RewriteRule (.+)/$ index.php?param=$1 RewriteRule (.+)/$ hoge.php?param=$1
と書いた場合に、1行目でマッチしても終了せず2行目に行くのでhoge.phpの方に書き換えられるっぽい。
次にQSAの方は「http://hoge.com/test/?id=1」とアクセスした場合に、QSAありだと「http://hoge.com/?param=test&id=1」になり、無しだと「http://hoge.com/?param=test」になった。
■その他
結局のところWordPressのhtaccessと同じような感じになった。RewriteCondとかオプションとか全く知らなかったので勉強になった。
関連記事
-
PHPにて自動でファイルを呼び出す(auto_prepend_file)
設定ファイルとかをinclude('config.php')みたいに、 いちいち ...
-
複数の方法で301リダイレクト
サイトのディレクトリやファイル名を大幅に変えるという案件があった。それ自体は問題 ...
-
どのページを開いても「メンテナンス中です」と表示させる方法
メンテナンスする際にどのページURLを叩いても「只今メンテナンス中です」と出した ...
-
フォルダにリンク制限をかける
imgというフォルダがあり、直接URLを叩いても 中身を見られないけど、同一サー ...
-
htaccessファイルでダイジェスト認証を行う方法
何かで調べ物をしていたときにdigest認証というものを見かけた。basic認証 ...