htaccessのAuthUserFileで相対パスを使用するにはどうすればよいですか?


98

基本認証を使用する.htaccessがあります。.htpasswdファイルへのパスはhtaccessファイルからの相対パスではなく、サーバー構成からのパスのようです。

したがって、同じディレクトリに.htaccessファイルと.htpasswdファイルがあるにもかかわらず、これは機能しません。

AuthType Basic
AuthName "Private Login"
AuthUserFile .htpasswd
Require valid-user

ただし、AuthUserFileを絶対パスを使用するように変更しても機能します。

AuthType Basic
AuthName "Private Login"
AuthUserFile "/home/user/public_html/mydir/.htpasswd"
Require valid-user

しかし、私はこれをさまざまな地域の複数のサイトで使用するため、もっとモバイルなものを好みます。私はウェブを検索しましたが、解決策はありませんでした。相対パスや変数を使用することは可能%{DOCUMENT_ROOT}ですか?

回答:


51

AuthUserFileに相対パスを使用することはできません。

File-pathは、ユーザーファイルへのパスです。絶対ではない場合(つまり、スラッシュで始まらない場合)は、からの相対として扱われServerRootます。

この制限を受け入れて回避する必要があります。


IfDefineapache2 コマンドラインパラメータと一緒に使用しています

.htaccess (開発システムとライブシステムの両方に適しています):

<IfDefine !development>
  AuthType Basic
  AuthName "Say the secret word"
  AuthUserFile /var/www/hostname/.htpasswd
  Require valid-user
</IfDefine>

開発サーバーの構成(Debian)

に以下を追加/etc/apache2/envvars

export APACHE_ARGUMENTS=-Ddevelopment

その後、Apacheを再起動すると、開発サーバー上にいない場合にのみパスワードプロンプトが表示されます。

もちろん、開発サーバーに別のIfDefineを追加することもできます!。ブロックをコピーしてを削除するだけです。


4
しかし、これはまだ絶対パス(/var/...)を使用しています-そして、質問は「相対パスの使用方法」を尋ねます?
sdaau 2015年

1
そして、質問は「いいえ」で適切に回答するように編集されました:)
Erenor Paz

15

万が一のために人々がこれに対する解決策を探している場合:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>

1
これは素晴らしいことですが、に依存しても安全req('Host')ですか、クライアントはこの値をだましませんか?
Marco Demaio

1
@MarcoDemaioはい、たとえばIPアドレスを使用してだまされる可能性があります。構成によって異なります。それは絶対的なイエスかノーではありません。場合によります。
Maxime、

12

1).htpasswdファイルをサーバーのルートの下に置くことは安全ではないと見なされることに注意してください。

2)ドキュメントは相対パスについてこれを言っているので、あなたは運が悪いようです:

File-pathは、ユーザーファイルへのパスです。絶対ではない場合(つまり、スラッシュで始まらない場合)、ServerRootを基準にして扱われます。

3)環境変数の使用を推奨する回答は完璧に機能し.htaccessますが、ファイルにプレースホルダーを配置するか、コードベースに異なるバージョンを用意し、展開プロセスですべてを設定します(つまり、プレースホルダーを置き換えるか名前を変更します/適切なファイルを移動します)。

Javaプロジェクトでは、Mavenを使用してこのタイプの作業を行います。たとえば、PHPプロジェクトでは、デプロイされたファイルを環境に合わせて調整するbuild.shおよび/またはinstall.shシェルスクリプトを用意します。これにより、ターゲット環境の詳細(つまり、環境変数と構成パラメーター)からコードベースが分離されます。一般に、アプリケーションは環境に適応する必要があります。逆に行うと、環境がさまざまなアプリケーションや完全に無関係なシステム固有の要件に対応しなければならない場合に問題が発生する可能性があります。


8

認証設定を環境に置くことができます。お気に入り:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development
<IfDefine !APPLICATION_ENV>
  Allow from all
  AuthType Basic
  AuthName "My Testseite - Login" 
  AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd
  Require user username
</IfDefine>

Authは機能していますが、実際に環境を稼働させることができませんでした。


1
問題はこれだと思います。「この方法でテストできるのは、以前のSetEnvIf [NoCase]ディレクティブで定義された環境変数のみです。「以前」とは、より広い範囲(サーバー全体など)または以前に定義されていたことを意味します。現在の指令の範囲。」(ここにあります:askapache.com/htaccess/setenvif.html)同じスコープを持っているため、環境を実行できませんでした。
user470370 2012年

4
なぜこれが動作していないが、非常に良いが、ここで説明されてstackoverflow.com/questions/11073752/...
ニコgawenda

しかし、これはまだ絶対パス(/Users/...)を使用しています-そして、質問は「相対パスの使用方法」を尋ねます?
sdaau

はい。ただし、環境ごとに複数の絶対パスを使用するために、複数のAPPLICATION_ENV設定を使用できます。
digitaldonkey

5

.htpasswdには、サーバーの絶対ルートからの完全な絶対パスが必要です。

echoでファイルの絶対パスを取得してくださいecho $_SERVER['DOCUMENT_ROOT'];

基本的なauth .htaccessスクリプトが動作しています。

AuthType Basic
AuthName "Access to the Hidden Files"
AuthUserFile 'C:/xampp/htdocs/ht/.htpasswd'
Require valid-user

ログイン前

ここに画像の説明を入力してください

Afetrログイン

ここに画像の説明を入力してください


3

WindowsでXAMPPを使用していて、ライブサーバーで.htaccessファイルを使用し、XAMPP開発マシンで開発する場合は、次の方法が最適です。


1)XAMPPの新規インストール後、Apacheがサービスとしてインストールされていることを確認してください。

  • これは、XAMPPコントロールパネルを開いて、Apacheモジュールの左側にある小さな赤い「X」をクリックして行います。
  • 次に、Apacheをサービスとしてインストールするかどうかを尋ねてきます。
  • その後、緑色のチェックマークに変わります。

2)Apacheがサービスとしてインストールされている場合、新しい環境変数をフラグとして追加します。

  • まず、XAMPPコントロールパネルからApacheサービスを停止します。
  • 次に、コマンドプロンプトを開きます。(あなたはDOSをシミュレートする小さな黒いウィンドウを知っています)
  • 入力-D "DEV" -k設定: "\プログラムファイル(x86の)\ xamppの\ apacheの\ binに\ httpd.exe Cを"
  • これにより、後で使用できる環境変数に新しいDEVフラグが追加されます。

3)Apacheを起動します

  • XAMPPコントロールパネルを開いて、Apacheサービスを開始します。

4)次の情報を使用して.htaccessファイルを作成します...

<IfDefine DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/sandbox/web/scripts/.htpasswd"
  require valid-user
</IfDefine>

<IfDefine !DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/home/arvo/public_html/scripts/.htpasswd"
  require valid-user
</IfDefine>

上記のスクリプトを説明するために、ここにいくつかの注記があります...

  • 私のAuthUserFileは、私の設定と個人設定に基づいています。
  • 私のウェブページがc:\ sandbox \ web \にあるローカルテスト開発ボックスがあります。そのフォルダー内に、パスワードファイル.htpasswdを含むスクリプトと呼ばれるフォルダーがあります。
  • 最初のエントリIfDefine DEVがそのインスタンスに使用されます。DEVが設定されている場合(これは上記で行ったものであり、coarseのdevマシンでのみ)、そのエントリを使用します。
  • そして、ライブサーバーを使用している場合は、IfDefine!DEVが使用されます。

5)次の情報を含むパスワードファイル(この場合は.htpasswd)を作成します...

ユーザー:$ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk。

注意すべきいくつかの事柄...


しかし、これはまだ絶対パス(/home...)を使用しています-そして、質問は「相対パスの使用方法」を尋ねます?
sdaau 2015年

2

またはlocalhostで開発する場合(Apache 2.4以降のみ):

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>

1

これは古い質問であることは知っていますが、同じことを検索しただけで、他の多くの人がすばやくモバイルソリューションを検索していると思います。これが私が最終的に思いついたものです:

# We set production environment by default
SetEnv PROD_ENV 1

<IfDefine DEV_ENV>
  # If 'DEV_ENV' has been defined, then unset the PROD_ENV
  UnsetEnv PROD_ENV

  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /var/www/foo.local/.htpasswd
  Require valid-user
</IfDefine>

<IfDefine PROD_ENV>
  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /home/foo/public_html/.htpasswd
  Require valid-user
</IfDefine>

しかし、これはまだ絶対パス(/var...)を使用しており、質問は「相対パスの使用方法」を尋ねます。
sdaau

1
はい、Apacheは.htaccessファイルの場所への相対パスをサポートしていないため、これは回避策です。相対パスを使用する場合、それはからの相対パスと見なされますServerRoot
ovi 2015年

1

例を見てみましょう。

アプリケーションは、一部のLinuxサーバーの/ var / www / myAppにあります。

.htaccess/var/www/myApp/.htaccess

htpasswdApp/ var / www / myApp / htpasswdApp。(.htpasswdファイルには任意の名前を自由に使用できます)

.htaccessで相対パスを使用するには:

AuthType Digest
AuthName myApp
AuthUserFile "htpasswdApp"
Require valid-user

しかし、server_rootディレクトリでファイルを検索します。document_rootにはありません。

場合によっては、アプリケーションが/ var / www / myAppにある場合

document_root/ var / www / myAppです

server_root/ etc / apache2です //(この例では、Linuxサーバーを使用しているため)

apache構成ファイル(/etc/apache2/apache2.conf)で再定義できますが、それは悪い考えだと思います。

自分の中で相対ファイルパスを使用するよう/var/www/myApp/.htaccess あなたにパスワードのファイルを定義する必要がありSERVER_ROOT

私は以下のコマンドでそれを行うことを好みます:

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

私のコマンドをコピーしたり、シンボルの代わりにハードリンクを使用したり、ファイルをserver_rootにコピーしたりできます。


1
Apacheはデフォルトで.ht *で始まるファイルへのアクセスをブロックするため、ランダムな名前を使用することはお勧めしません。
cari 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.