通常の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
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
expr
essionリファレンスはこちらです: https://httpd.Apache.org/docs/2.4/expr.html
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
変数が設定されている場合。
このソリューションは非常にうまく機能し、通過させるホワイトリストを定義するだけです。
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
私は他の解決策を試しましたが、これが私にとってうまくいったことです。うまくいけば、他の人の助けになるでしょう。
# 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
は最初にログインを求められます
<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>
別の方法は、保護する領域にモノリシックPHP Wordpressなどのすべてを制御するスクリプトがある場合。別のディレクトリで認証を設定します。そこに設定するindex.phpを置きます。パス '/'のCookie。その後、Wordpress(たとえば)で、Cookieをチェックしますが、$ _ SERVER ['REQUEST_URI']が除外URLである場合はチェックをバイパスします。
私の共有ホスティングプラットフォームでは、RewriteRuleは「すべてを満たす」で機能する環境変数を設定できませんでした。
いずれのアプローチでも、保護しているページには、ページ自体に含まれていないときに認証要求をトリガーする画像、スタイルシートなどが含まれていないことに注意してください。
なぜ基本認証を意図したとおりに使用しないのですか?
user:[email protected]/callbacks/etc
以下のコードをルート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.
それでも問題が解決しない場合はお知らせください。