web-dev-qa-db-ja.com

htaccessは、基本認証から1つのURLを除外します

通常のhtaccess基本認証保護から1つのUrl(またはさらに良い1つのプレフィックス)を除外する必要があります。何かのようなもの /callbacks/myBank または /callbacks/.*その方法のヒントはありますか?

私が探していないのは、ファイルを除外する方法です。これはURLである必要があります(これはPHPフレームワークに基づくソリューションであり、すべてのURLはmod_rewriteからindex.php)。したがって、このURLにはファイルはありません。なし。

これらのURLの一部は、他のサービスからのコールバックにすぎず(IPが不明なので、IPに基づいて除外できません)、ユーザー/パスワードの入力を求めることができません。

現在の定義は次のように簡単です:

AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
require valid-user 
71
KrzysDan

Apache 2.4を使用している場合、SetEnvIfディレクティブは式を直接解釈できるため、Requireおよびmod_rewriteの回避策は不要です。

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require valid-user

Apache 2.4は、<RequireAll>内にあるかのように<RequireAny>でグループ化されたnotRequireディレクティブを処理します。 「声明。以下は、リクエストURIとクエリ文字列の両方を一致させ、有効なユーザーの要求にフォールバックすることを示すより複雑な例です。

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

<RequireAny>
    <RequireAll>
        # I'm using the alternate matching form here so I don't have
        # to escape the /'s in the URL.
        Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#

        # You can also match on the query string, which is more
        # convenient than SetEnvIf.
        #Require expr %{QUERY_STRING} = 'secret_var=42'
    </RequireAll>

    Require valid-user
</RequireAny>

この例では、/callbacks/foo?secret_var=42へのアクセスは許可されますが、/callbacks/fooにはユーザー名とパスワードが必要です。

<RequireAll>を使用しない限り、Apacheは各Requireを順序で照合しようとすることに注意してください。最初に許可します。

Requireディレクティブのリファレンスは次のとおりです。 https://httpd.Apache.org/docs/2.4/mod/mod_authz_core.html#require

expressionリファレンスはこちらです: https://httpd.Apache.org/docs/2.4/expr.html

46
beporter

SetEnvIf を使用すると、リクエストがパスで始まるときに変数を作成し、Satisfy Anyディレクティブを使用してログインする必要を回避します。

# set an environtment variable "noauth" if the request starts with "/callbacks/"
SetEnvIf Request_URI ^/callbacks/ noauth=1

# the auth block
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd

# Here is where we allow/deny
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth

ディレクティブの許可/拒否チャンクは、[〜#〜] everyone [〜#〜]に対するアクセスを拒否することを示しています。ただし、valid-user(成功したBASIC認証がある場合を除く) login)またはnoauth変数が設定されている場合。

81
Jon Lin

このソリューションは非常にうまく機能し、通過させるホワイトリストを定義するだけです。

SetEnvIfNoCase Request_URI "^/status\.php" noauth

AuthType Basic
AuthName "Identify yourself"
AuthUserFile /path/to/.htpasswd
Require valid-user

Order Deny,Allow
Deny from all
Allow from env=noauth

Satisfy any
6
Nick Z

私は他の解決策を試しましたが、これが私にとってうまくいったことです。うまくいけば、他の人の助けになるでしょう。

# Auth stuff
AuthName "Authorized personnel only."
AuthType Basic
AuthUserFile /path/to/your/htpasswd/file

SetEnvIf Request_URI "^/index.php/api/*" allow
Order allow,deny
Require valid-user
Allow from env=allow
Deny from env=!allow
Satisfy any

これにより、API URLおよび/index.php/api/の後のURL文字列をログインせずに開くことができ、他のものはログインするように求められます。

例:

mywebsite.com/index.php/apiはログインを求められずに開きますmywebsite.com/index.php/api/soap/?wsdl=1はログインを求められずに開きますmywebsite.comは最初にログインを求められます

1
MagentoMan
<location />
        SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1

        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/passwords/passwords
        Order Deny,Allow
        Satisfy any
        Deny from all
        Allow from env=REDIRECT_noauth
        Require user yournickname
</location>
1
bluszcz

別の方法は、保護する領域にモノリシックPHP Wordpressなどのすべてを制御するスクリプトがある場合。別のディレクトリで認証を設定します。そこに設定するindex.phpを置きます。パス '/'のCookie。その後、Wordpress(たとえば)で、Cookieをチェックしますが、$ _ SERVER ['REQUEST_URI']が除外URLである場合はチェックをバイパスします。

私の共有ホスティングプラットフォームでは、RewriteRuleは「すべてを満たす」で機能する環境変数を設定できませんでした。

いずれのアプローチでも、保護しているページには、ページ自体に含まれていないときに認証要求をトリガーする画像、スタイルシートなどが含まれていないことに注意してください。

0
kitchin

なぜ基本認証を意図したとおりに使用しないのですか?

user:[email protected]/callbacks/etc
0
ryaan_anthony

以下のコードをルートhtaccessファイルに追加し、管理URL、.htpasswdファイルページを変更することを忘れないでください。

<Files "admin.php">
        AuthName "Cron auth"
        AuthUserFile E:\wamp\www\mg\.htpasswd
        AuthType basic
        Require valid-user
    </Files>

ルートフォルダーに.htpasswdファイルを作成し、ユーザー名とパスワードを追加します(デフォルトのユーザー名:adminおよびパスワード:admin123を設定します)

admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.

それでも問題が解決しない場合はお知らせください。

0
Nits