カテゴリ | |
---|---|
サマリ | CGI版PHPでheader()関数が使えないのでBasic認証が通らない |
バージョン | 1.4.3 |
投稿者 | ray |
状態 | 完了 |
投稿日 | 2004-05-31 (MON) 16:29:30 |
編集制限をかけて、認証ダイアログに正確なユーザ名とパスワードを入力しても通らず、自分なりに調べた結果、Basic認証の部分で使っているheader()関数はCGI版PHPでは使えないことが原因のような気がします。(auth.phpの内容を見ての素人考えなのですが) CGI版PHPでは認証による制限は諦めるしかないでしょうか? ちなみに、当方のHPスペースはCOOL ONLINEでCGI版PHPしか使えません。
質問箱/2085参照。
PHP による HTTP 認証のフックは、Apache モジュールとして実行した時のみ 有効で、CGI 版では利用できません。
CGI版PHPでは、HTTP認証ができないので、自前でディレクトリ単位で認証するしかありません。
あれ?僕のコメントが消された。内容が間違ってましたか?>reimyさん(?)
ん? 消してないですけど。なんで消えたんだろ?
htaccess は使えますが、COOL ONLINE正規会員では、設定ファイル名を「cool_htaccess」として下さい。(COOL ONLINE・FAQ)
これのことが書かれてたと思いますが、これはPHPのHTTP認証とは直接関係ないです。
はい。ディレクトリ毎でよければ、.accessでBasic認証できますねって話でした。_o_
丁寧な回答ありがとうございます。
PukiWiki関連とは若干離れてしまいますが、htaccessの設定によってBasic認証を行い、特定ユーザにのみ書き込みを許す(閲覧は全員OK)のようなことはできるのでしょうか?
現在も色々見て回っているのですが、なかなかそういう内容のページが見つからないので、少々場違いな質問で申し訳ないのですが、教えていただけると助かります。
COOL ONLINEはhtaccessの設定できる項目も少なくてどこまで出来るのか不安です・・・
参考
COOL ONLINE ディレクトリごとの設定仕様
ディレクトリアクセスの制限のみだと思います。書き込みと閲覧の区別はできないはず。
追記です。
その後の調べで、.htaccess内にて
<Limit POST> AuthName "Please input ID and Password" AuthUserFile /絶対パス/htpassファイル AuthType Basic require user xxx </Limit>とPOSTメソッドにのみ制限をかけることによって閲覧可能で編集(の決定)不可という状態に出来ました。私が気がついたのではないのですが、どこかのページでWikiは編集決定時にデータをPOSTメソッドにて送っていると書いてあったので、そこだけ制限をかけることによってそれっぽく動いてくれました。
POSTメソッドを使うarticleやlookup、searchなど一部のプラグインやコマンドで制限が出てしまうと思いますが、通常の使用では問題ないでしょう。
search.inc.phpはGETメソッドに書き換えた方がいいかも。dev:BugTrack/584参照。
MenuBarなどにlookupを使って検索窓を設置している場合は、searchプラグインの他にlookupプラグインのメソッドもGETにしておかないといけないようです。
さっそくsearchをGETメソッドに書き換えました。
需要はすごく少ないんでしょうけど、普通の入力フォームによる認証が出来るとCGI版PHPの環境でも(それ以外にBasic認証をさける必要性があるか謎ですが)救われるなぁ、と思わず勝手なことを考えてしまいました。
ともあれ、数々の丁寧な回答、本当にありがとうございました。
mod_setenvif が使えれば,.htaccess に以下の記述でできるかも.
少なくとも,こちらの環境ではできてます.
Apache/2.2.3 + PHP/5.2.5 + PukiWiki/1.4.7
SetEnvIfNoCase Authorization "^(Basic .*)$" HTTP_AUTHORIZATION=$1
- Apache1.4系+ PHP/5.2.5 + PukiWiki/1.4.7ではだめでした>< -- @@ 2008-01-10 (木) 16:49:23
- Apache 1.3.41でも、書き方変えたらできました。 -- ぽて 2009-07-22 (水) 09:00:28
- .htaccessにBASE64でユーザ名:パスワードを追加する。
Apache1.3では、HTTP_AUTHORIZATION=$1の$1が置き換えられないので...
SetEnvIfNoCase Authorization "^(Basic dGVzdDpob2dlaG9nZQ==)$" HTTP_AUTHORIZATION='dGVzdDpob2dlaG9nZQ=='
ユーザ名:パスワード BASE64 test:hogehoge dGVzdDpob2dlaG9nZQ== - lib/auth.php auth.phpファイルの次の一部を変更する。
isset($_SERVER['HTTP_AUTHORIZATION']) && preg_match('/^Basic (.*)$/', $_SERVER['HTTP_AUTHORIZATION'], $matches))↓isset($_SERVER['HTTP_AUTHORIZATION']) && preg_match('/^(.*)$/', $_SERVER['HTTP_AUTHORIZATION'], $matches))上手く行かなければ、$_SERVER['HTTP_AUTHORIZATION']を
$_ENV['HTTP_AUTHORIZATION']に置き換える。
これで、上手く行くかも。