質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.09%

【Apache】特定のページだけBasic認証を外したいが、解決できない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,636

score 442

やりたいこと

Webサイト全体にBasic認証をかけますが、特定のページ(特定のパス以下)の場合のみBasic認証を外したいです。
これをApacheの設定で実施したいです。

(例)
https://example.com/ → Basic認証あり
https://example.com/menu/ → Basic認証あり
https://example.com/noauth/ → Basic認証なし

悩んでいること

色々調べて、Apacheの設定で全体にBasic認証を実装することまでは出来ておりますが、
特定のページ(特定のパス以下)の場合のみBasic認証を外す挙動が出来ずに悩んでいます。

Wordpressの為、Webサイトにディレクトリは存在しません。
その為設定は、DirectoryディレクティブではなくLocation もしくは LocationMatchで行うものかと考えていますが、現状うまくいっていません。

実行環境

サーバ: Amazon EC2, AmazonLinux2
Webサーバ: Apache2.4
Wordpress実行環境: KUSANAGI

うまくいかなかった設定例1

以下confファイルを作成してapacheをreloadした場合、/noauthにだけBasic認証がかかってしまいました。
(ファイル /etc/httpd/conf.d/auth_basic.conf)

# 全てにBasic認証をかける
# あるIPアドレスはアクセス拒否する(virtualhostで設定済)
<Location "/">
 <RequireAll>
  AuthType Basic
  AuthName "Basic Auth"
  AuthUserFile /hoge1/hoge2/kusanagi/example.com/DocumentRoot/.htpasswd

  Require valid-user
  Require not env block_ip
 </RequireAll>
</Location>

# パスが/noauthから始まる場合はBasic認証をかけない
# あるIPアドレスはアクセス拒否する(virtualhostで設定済)
<LocationMatch ^(?!(/noauth))>
 <RequireAll>
  Require all granted
  Require not env block_ip
 </RequireAll>
</LocationMatch>

【追記】
色々試す内に何故上記のように設定をしようとしたか覚えていないのですが、
<LocationMatch ^(?!(/noauth))>ではなく<LocationMatch /noauth>でも試してみましたが、その場合はどちらもBasicがかかったままの状態になりました

うまくいかなかった設定例2

全体にBasicがかかったまま

<Location "/">
 <RequireAll>
  AuthType Basic
  AuthName "Basic Auth"
  AuthUserFile /hoge1/hoge2/kusanagi/example.com/DocumentRoot/.htpasswd

  Require valid-user
  Require not env block_ip
 </RequireAll>
</Location>
<Location /noauth>
 Satisfy Any
 Require all granted
 Require not env block_ip
</Location>

うまくいかなかった設定例3

全体にBasicがかかったまま
全体にBasicをかけるが、/noauthの場合のみ全て許可する、というイメージで設定をしているのですが、思ったような挙動ではないです、、

<Location "/">
 <RequireAll>
  AuthType Basic
  AuthName "Basic Auth"
  AuthUserFile /hoge1/hoge2/kusanagi/example.com/DocumentRoot/.htpasswd

  Require valid-user
  Require not env block_ip
 </RequireAll>
</Location>

<Location /noauth>
 <RequireAll>
  Require all granted
  Require not env block_ip
 </RequireAll>
</Location>


 
 
 
思い当たる原因を1つずつ潰してはいるものの、現在潰し切ってしまい困り果てている状況です。
上記、設定の誤りや、疑わしい箇所などございましたら
恐れ入りますがご教示頂けますと幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

設定例1については明らかな誤りで、/noauthで「始まらない」URIに対して条件を設定しています。
正確には少し違うかもしれませんが。

2については、Apache2.2台の書き方と2.4台の新しい書き方が混在しています(Satisfy Anyは古い書き方)
混在させることもできるとは思いますが、思わぬところで思わぬ動作をすることがあるので統一すべきでしょう。
3については、2のSatisfy Anyと同じことをやるのならRequireAnyだと思うんですが、それで正しいのかはわかりません。そうするとIP制限が効かなそうな気もしますし…。

正直正確なところは試しながらやるしかないですが、参考になりそうなところをいくつか貼っておきます。
Apache 2.4のアクセス制御をもうちょっとマジメに見てみた
Apache2.4 のRequireディレクティブでアクセス制御を行う

SetEnvIfでRequest_URIを見るのもいいかもしれないです。
Apache2.4でアクセス制御の方法を調べた

Apacheの設定面倒ですよね…。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/11 18:01

    ご回答頂きありがとうございます。

    > 設定例1については明らかな誤り
    こちら、投稿後に自分でも気が付きました…無我夢中で試行錯誤していると、こういう変なミスがありますね

    2については、Satisfy AnyではなくRequireAnyを使用すべきでしたね。こちらもご指摘いただきありがとうございます
    色んなサイトを参考にAnyを指定していたのですが、IP制限もかけたいのでこの場合はRequireAllを使用するしかなさそうです…。。

    > 試しながらやるしかない
    参考サイトに関して、ありがとうございます!
    こちら確認してみます。

    > SetEnvIfでRequest_URIを見るのもいいかもしれないです。
    なるほど、Request_URIを使ってrequireしてみる方法もあったのですね。

    現状まだ解決出来ていないのですが、引き続き粘ってみます!
    どうしてもダメなら、要件に沿って方法の見直しを検討してみます。課題を残すことになってしまうので、気持ちが悪いですが……。

    ご丁寧に、ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る