リライトルールのサンプル集

周辺のツイートを

リライトルールのサンプル集 - WEBアプリ開発

  • Apache 2.4 のmod_rewriteのリファレンスマニュアル

http://httpd.apache.org/docs/current/mod/mod_rewrite.html

  • Apache 2.2 のmod_rewriteのリファレンスマニュアル

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^virtual1\.html test/page1.html [L]

RewriteCond

RewriteCondとRewriteRuleの関係性

  • 空行やコメントがあっても有効。(virtual1.htmlはエラーとなり、81→80にすると表示された。)
    RewriteCond %{SERVER_PORT} 81
    
    #RewriteCond %{REQUEST_FILENAME} !-f
    
    RewriteRule ^virtual1\.html test/page1.html [L]
  • RewriteCondの間に空行があっても複合条件となる。(virtual1.htmlはエラーとなり、81→80にすると表示された。)
    RewriteCond %{SERVER_PORT} 81
    
    RewriteCond %{REQUEST_URI} virtual1\.html
    
    RewriteRule ^virtual1\.html test/page1.html [L]
  • このRewriteCondはvirtual1.htmlには適用されない。(virtual2.htmlはエラーになるけどvirtual1.htmlは表示された。)
    RewriteCond %{SERVER_PORT} 81
    
    RewriteRule ^virtual2\.html test/page1.html [L]
    RewriteRule ^virtual1\.html test/page1.html [L]
  • 同じく、このRewriteCondはvirtual1.htmlには適用されない。(virtual2.htmlはエラーになるけどvirtual1.htmlは表示された。)
    RewriteCond %{SERVER_PORT} 81
    
    RewriteRule ^virtual2\.html test/page1.html
    RewriteRule ^virtual1\.html test/page1.html [L]
  • このRewriteCondはvirtual1.htmlにも適用される。(virtual1.htmlとvirtual2.htmlの両方がエラーになった。)
    RewriteCond %{SERVER_PORT} 81
    
    RewriteRule ^virtual2\.html test/page1.html [C]
    RewriteRule ^virtual1\.html test/page1.html [L]

RewriteCondの%{環境変数}で使用できる環境変数

  • HTTPヘッダ
HTTP_USER_AGENTユーザーエージェント
HTTP_REFERERリファラー
HTTP_COOKIECookie
HTTP_FORWARDED
HTTP_HOSTホスト名
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
  • コネクションとリクエスト
REMOTE_ADDRリモートのIPアドレス
REMOTE_HOSTリモートのホスト名
REMOTE_PORTリモートのポート番号
REMOTE_USER認証されたユーザー
REMOTE_IDENT
REQUEST_METHODリクエストのメソッド名
SCRIPT_FILENAME現在実行されているスクリプトの絶対パス
PATH_INFOパス名情報
QUERY_STRINGクエリー文字列
AUTH_TYPEHTTP認証している場合の認証形式
  • サーバー情報
DOCUMENT_ROOTドキュメントルート
SERVER_ADMINWebサーバーの設定ファイルのSERVER_ADMINディレクティブ にセットされている値
SERVER_NAMEサーバーのホスト名
SERVER_ADDRサーバーのIPアドレス
SERVER_PORTサーバーのポート番号
SERVER_PROTOCOLプロトコル名とバージョン
SERVER_SOFTWAREサーバーの認識文字列
  • システム関連
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
  • その他
API_VERSION
THE_REQUEST
REQUEST_URIページにアクセスするために指定されたURI
REQUEST_FILENAME
IS_SUBREQ
HTTPSスクリプトがHTTPSプロトコルを通じて実行されている場合に空でない値が設定される

RewriteBase

ドキュメントルートが違うのだから、やはりRewriteBaseを変えて切り分けるのが正解なのかなぁ???

RewriteBase /
RewriteRule ^virtual2\.html test/page1.html
RewriteRule ^virtual1\.html test/page1.html

RewriteBase /sample_napzak_com
RewriteRule ^virtual2\.html test/page1.html
RewriteRule ^virtual1\.html test/page1.html

レンタルサーバーの共用SSLの場合、RewriteRuleのパターン部分はPHPでいうところの$_SERVER["REQUEST_URI"]の内容とは限らないのかも!?ドメイン名に相当する部分が削られ、非SSLの場合の$_SERVER["REQUEST_URI"]の内容になるケースが多いのでは!?となると、RewriteBaseでその位置を調整するとちょうどよいアンバイになるのかも!?

wwwありをwwwなしにリダイレクト

RewriteCond %{HTTP_HOST} ^www\.napzak\.com
RewriteRule (.*) http://napzak.com/$1 [R=301,L]

wwwなしをwwwありにリダイレクト

RewriteCond %{HTTP_HOST} ^napzak\.com
RewriteRule (.*) http://www.napzak.com/$1 [R=301,L]
周辺のツイートを

Cookieによる振り分けルール

%{HTTP_COOKIE}でCookieの内容をRewrite条件に使用できるので、これを利用してCookieの特定キーの有無、値の内容などで振り分けルールを記述する。
ここで注意が必要なのは、%{HTTP_COOKIE}で返る値はCookie名でもなくCookie値でもなく、環境変数のHTTP_COOKIEに格納されている値(name=data; name=data; ・・・)ということ。そのことを考慮して正規表現のルールを記述する。環境変数の内容については phpinfo関数で確認することができる。

# メンテナンス中の対応
RewriteCond %{REQUEST_FILENAME} !secret_cookie.php
RewriteCond %{HTTP_COOKIE} !IAM=
RewriteRule ^(.*)$ maintenance.html [L]

上記の例では「IAM」という名前のCookieを保持していなければmaintenance.htmlにリライトする。

メンテナンス中のアクセス振り分けでIP制限が使えない場合の代案

WEBアプリケーションのリリース作業などで、一般ユーザーがアクセスしてきた場合はメンテナンス画面へ強制遷移させたい場合がある。しかしこのとき、開発者や運営者は通常どおりアクセスして、動作確認したいケースがある。そのような場合は、一般的にはアクセス元IPアドレスによる振り分けルールを記述するが、ケータイやスマホなどの電話回線網からアクセスして確認する必要がある場合は、IPアドレスによる振り分けルールが使えない。そこで秘密のURLから隠しCookieをWEBブラウザに忍ばせておき、上記のRewriteルールで隠しCookieを保有しているかどうかをチェックして、振り分けを行う。

隠しCookieをWEBブラウザに忍ばせる秘密のCGIのサンプル

Basic認証の代わりにCookieとリライトルールで認証

secret_cookie.php で秘密のCookieをブラウザに格納し、以下のようなリライトルールで特定のCookieの有無でページ参照を振り分ける。以下の例では Cookieが存在しない場合に 404 Not Found を返す。
サイト公開の直前チェックや公開後のメンテナンス作業などで、Basic認証を使わずに簡易に特定ユーザーだけサイトへのアクセスを許可したい場合に便利な方法。

RewriteCond %{HTTP_COOKIE} !IAM=
RewriteRule ^ - [R=404,L]

ユーザーエージェントによる振り分けルール

%{HTTP_USER_AGENT}でWEBブラウザのユーザーエージェントをRewrite条件に使用できるので、これを利用して特定のWEBブラウザに対して振り分けルールを記述する。

# IEは未対応!
RewriteCond %{HTTP_USER_AGENT} (MSIE)
RewriteRule ^(.*)$ /ie_no_thankyou.html [R,L]

アクセス元IPアドレスによる振り分けルール

%{REMOTE_ADDR}でアクセス元IPアドレスをRewrite条件に使用できるので、これを利用して特定のアクセス元からの通信に対して振り分けルールを記述する。

# 特定IPのみ振り分け
RewriteCond %{REMOTE_ADDR} ^127\.0\.0\.1$
RewriteRule ^(.*)$ /yourself.html [R,L]
# 特定IP以外を振り分け
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteRule ^(.*)$ /welcome.html [R,L]
# 前方一致で下位レベルをワイルドカード扱いとする
RewriteCond %{REMOTE_ADDR} !^123\.456\.789
RewriteRule ^(.*)$ /welcome.html [R,L]

ファイルやディレクトリが存在しないことが条件の振り分けルール

%{REQUEST_FILENAME}に-f(ファイル)や-d(ディレクトリ)の識別子を組み合わせることで、ファイルやディレクトリが存在しない場合だけに適用される振り分けルールを記述する。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*).html$ /$1.php [L,QSA]
# ErrorDocument 404 http://napzak.com/ の代用として404エラーのリダイレクト
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ http://napzak.com/ [L,R]

正規表現上の記述パターン

Rewriteルールを書く上で記述する正規表現のパターン

ディレクトリ末尾のスラッシュ(/)あり/なしをどちらにも対応する

[/]?でスラッシュ(/)があってもなくても良いようにする。

RewriteRule ^entry[/]?$ index.php?action=entry [L,QSA]

スラッシュ(/)区切りのパスを抜き出す

RewriteRule ^aaa/([^/]*)/bbb/([^/]*)[/]?$ index.php?aaa=$1&bbb=$2 [L,QSA]
添付ファイル: filesecret_cookie.php 877件 [詳細]