mod_rewrite

全てのアクセスを特定のファイルに飛ばす

やりたいこと

  • https://aaa/bbb/~への全てのアクセスは、https://aaa/bbb/index.phpで受ける
  • index.phpは、「~」部分をパラメータとして受け取る
  • cssやjsなど、実在するファイルに対しては書き換えを行わない

.htaccessで、以下のようにすればいい。(index.phpと同じ階層に作成)

<IfModule rewrite_module>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

  • RewriteCond %{REQUEST_FILENAME} !-dで、実在するディレクトリに対しては書き換えルールを適用しない
  • RewriteCond %{REQUEST_FILENAME} !-fで、実在するファイルに対しては書き換えルールを適用しない
    • 並列するとAND条件になる。ちなみに末尾に[OR]フラグを付けると、OR条件になる
  • [QSA]フラグは、Query String Appendを意味し、もし元のURLにもGETパラメータが存在した場合、それを付け加える
  • [L]フラグは、Lastを意味し、マッチすれば書き換えは終わり。以降に別のルールがあっても再適用しない

GETパラメータの「_url」に、URLルート以降の文字列が入っている。
もしhttps://aaa/bbb/にアクセスするなど、URLルート以降の文字列が無かった場合は、GETパラメータに「_url」自体が存在しない。

programming/web_server/apache/mod_rewrite.txt · 最終更新: 2018/07/04 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0