mod_rewrite
あるドメインにはRewriteを適用しない
以下の設定で、not-rewrite-domain.com へのアクセスには書き換えが適用されない。
<IfModule rewrite_module> RewriteEngine On RewriteCond %{HTTP_HOST} ^not-rewrite-domain\.com RewriteRule .* - [L] # Rewrite Rules RewriteRule ^(.*)$ ... ... </IfModule>
もちろん以下のように書いてもいいが、Ruleが複数になってくると逐一書かなければならないので、上記の方が読みやすい。
<IfModule rewrite_module> RewriteEngine On RewriteCond %{HTTP_HOST} !^not-rewrite-domain\.com RewriteRule ^(.*)$ ... RewriteCond %{HTTP_HOST} !^not-rewrite-domain\.com RewriteRule ^(.*)$ ... ... </IfModule>
全てのアクセスを特定のファイルに飛ばす
やりたいこと
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」自体が存在しない。