- 締切済み
BASIC認証でユーザー名取得
こんにちは。 現在、BASIC認証を使用した簡易会員サイトを作っています。 誰がいつログイン?したか履歴を取りたくて、会員サイト内のhtmlファイルがアクセスされた際に、cgiファイルを起動し、履歴取得をする方法で考えていましたが、ユーザー名が空欄になってしまい、どうにもうまくいきません? 現在、会員サイト内の公表ファイルは、[home]以下に入っており、そこにhtaccessも配置しています。 cgiファイルは、[cgi-bin]以下でしか動作しないので、この中に配置しています。 何か良い方法があればご教授願います。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- superside0
- ベストアンサー率64% (461/711)
> REMOTE_HOSTだけが空欄になってしまいます。 > ご指摘の通り、[home]と[cgi-bin]が別フォルダのため、取得出来ないのでしょうか? REMOTE_HOSTとBASIC認証は、まったく別件です。 多分、WebサーバーでのDNSへの問合せ負荷を軽減するために、 サーバー側の設定で ホスト名への逆引きを行っていないのでしょう。 (この場合、 REMOTE_ADDRのIPアドレスをそのままREMOTE_HOSTにコピーする仕様のサーバーと REMOTE_HOSTを空にするサーバーがあるようです) クライアントのホスト名が どうしても欲しいのであれば、CGI(perl)内で $addr = $ENV{'REMOTE_ADDR'}; $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $addr; のようにして、自力でIPアドレスからホスト名に逆引きするようにすれば解決するはずです。
- superside0
- ベストアンサー率64% (461/711)
> 現在、会員サイト内の公表ファイルは、[home]以下に入っており、そこにhtaccessも配置しています。 > cgiファイルは、[cgi-bin]以下でしか動作しないので、この中に配置しています。 多分、CGI内で $ENV{'REMOTE_USER'}を使ってBASIC認証のユーザー名を取り出そうとしてしても、 CGIを設置したcgi-binディレクトリでは BASIC認証をかけていないので、認証情報がないので 空になってしまうということでしょう。 対処方法はいろいろあるのでしょうけど、以下ではどうでしょう。 【案1】 .htaccessで Options +ExecCGI AddType text/html pl AddHandler cgi-script pl のような記述をすればcgi-binディレクトリ以外でもCGIが動かせるサーバーもあるので 会員用のhomeの.htaccessにこれを書いて、home下にCGIファイルを設置して試してみる。 【案2】 cgi-binにも.htaccessを設置してBASIC認証をかける (非会員用のCGIも混在しているなら、 BASIC認証を適応するファイルを .htaccessの<Files>で限定的にするとか 会員用CGIは、cgi-bin下にサブディレクトリ化するとか) 【案3】 cgi-bin/members といったサブディレクトリを作って、ここでBASIC認証をかけて この下に、会員用コンテンツやCGIを移動する。
補足
ご回答ありがとうございます。 案2を試した結果、REMOTE_USERとREMOTE_ADDRは取得出来るようになりましたが、REMOTE_HOSTだけが空欄になってしまいます。 ご指摘の通り、[home]と[cgi-bin]が別フォルダのため、取得出来ないのでしょうか?
- notnot
- ベストアンサー率47% (4900/10359)
>ユーザー名が空欄になってしまい、どうにもうまくいきません? 具体的には何が空欄ですか? 環境変数 REMOTE_USER 、perlだと $ENV{"REMOTE_USER"} に入っていませんか?
補足
REMOTE_USERや、HTTP_HOST、HTTP_REFERER、REMOTE_ADDRを取得したいのですが、ユーザーは空欄になり、ホストは(http://aaa.com/)、アクセス元のURLは(http://aaa.com/member/)になってしまいます。
- heburusu
- ベストアンサー率85% (140/164)
BASIC認証の情報はHTTPヘッダのAuthorizationに格納されますが、 デフォルトのApache設定では環境変数にセットされないようですね。 参考URLのように、.htaccessにRewriteRuleを記述してはどうでしょうか?
お礼
おかげ様で、うまく取得出来ました。 ありがとうございました。