勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

日本語込みのURLをRewriteRuleで書き換える方法

   2024/03/01  Apache サーバー

WordPressのパーマネントリンク的なことをhtaccessで実現したい。具体的には「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} !-d

RwriteCondは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とかオプションとか全く知らなかったので勉強になった。

 - Apache サーバー

  関連記事

画像やPDF等のファイルへの直接アクセスは禁止し、PHP経由のみ表示やダウンロードを可能にする

ファイルアップローダーを作成する案件があり、アップロードしたファイルは「http ...

他ドメインから画像の呼び出し(直リンク)を禁止する方法

他ドメインからの画像の呼び出し、いわゆる直リンクの禁止を行いたかった。調べるとh ...

firebugで「CORS を有効にすると解決できます」と表示される際の対応方法

Aサーバーにjsとかcssとか画像とかを置いて、Bサーバーで呼び出す際にちゃんと ...

htaccessを置いてあるフォルダのファイルを参照

曖昧だけどhtaccessでベーシック認証とかIP制限かかってる フォルダ内のプ ...

フォルダにリンク制限をかける

imgというフォルダがあり、直接URLを叩いても 中身を見られないけど、同一サー ...