[php] phpでルーティング (認証) 実装を試みた記録(失敗例)

  • やりたかったこと:サイトに対する全てのアクセスを唯一のphpファイル(ここではindex.php)に飛ばし、そこで認証を実行した後に、最初にリクエストされたページを表示する。
  • 方針
    1 Apacheのmod_rewiteでサイトに対する全てのアクセスをindex.phpに飛ばす
    2 index.phpで認証処理を実行後、最初にリクエストされたページを表示する。header(“location: “.$_SERVER[REQUEST_URI]);で行けるのではないかと考えた。
  • 結果: 1は成功したが2を実施すると無限ループに陥ってしまう。結局この問題は完全には解决できなかった。

Apacheのmod_rewiteでサイトに対する全てのアクセスをindex.phpに飛ばすための設定

  • httpd.confのディレクティブ内に下記の記述を追加した。
RewriteEngine On
RewriteCond %{REQUEST_URI} !(^(.*)/admin/index.php(.*))     
RewriteRule ^(.*)$ /admin/index.php?$1 [NS,L]

index.phpから戻ってきた場合に、rewrite処理を行わないようにさせる

  • 環境変数を用いる方法、HTTP HEADER内にカスタム情報をセットする方法を試みるも成功しなかった。これらの変数はsurviveしていない可能性があるらしい。
  • QUERY_STRINGを用いた方法ではQUERY_STRINGそのものはsurviveしていたため無限ループを防止することはできたが、QUERY_STRINGが丸見えなため、根本的なセキュリティ向上に寄与していないように思えた。

以下mod_rewriteでいろいろ実験したことの覚書。

RewiteCondについて

書式:RewriteCond テスト文字列 条件パターン オプション
  • RewriteCond を複数連続して記述した場合AND条件となる。OR条件に場合は明示的に[OR]で連結する必要あり。

Apache環境変数に変数をセットする/削除する

+ RewriteRule .* - [E=X_KEY1:VALUE1,]   # 変数名(KEY1)、値(VALUE1)という変数を作成する
  • 削除するときは[E=!KEY1]
  • phpから$_SERVER[“変数名”] = 値として、mod_rewriteから読み出しを試みたが動かなかった。変数はsurviveしない可能あり。
  • RewriteCond %{ENV:X_LOGIN} !(^PASS$) # これは動かなかった

EXITNOW

  • 一般的なプログラミング言語におけるループからのexitに相当するものとして下記のような記述を提案するweb情報があった。
RewriteRule ^(.*)$ - [L]
  • しかしこれは期待したようなexitとしての機能を果たさなかった。
  • [END]というオプションについて言及しているものもあったがこれも動かず。

コメント