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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

Q&A

解決済

1回答

2020閲覧

Apache 2.4の.htaccessにおけるBasic認証とIPアドレス制限の設定について

yukoyu988

総合スコア1

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

0グッド

1クリップ

投稿2022/03/17 02:14

編集2022/03/17 06:16

Apache 2.4の.htaccessで以下の2つを実現したいです。

【環境】
.htaccessを利用する環境はフレームワークのSymfonyで構築したサイトで
一般的なサイトのように物理ディレクトリが存在せずルーティングによってURLを指定するため
.htaccessをディレクトリごとにわけるような方法はとれません。

  1. 特定のURLに対するアクセスにBasic認証を設定する
  2. サイト全体で特定のIPアドレスからのアクセスを拒否する

それぞれ以下の方法で実現可能なことはわかったのですが、

【特定のURLに対するアクセスにBasic認証を設定する】

AuthType Basic AuthName "Please enter username and password" AuthUserFile /path/to/.htpasswd AuthGroupFile /dev/null require valid-user SetEnvIf Request_URI "^/admin" admin_path <RequireAll> Require all granted Require not env admin_path </RequireAll>

【サイト全体で特定のIPアドレスからのアクセスを拒否する】

<RequireAll> Require all granted <RequireNone> Require ip <IPアドレス> Require ip <IPアドレス> </RequireNone> </RequireAll>

これら両方を実現する方法がわかりません。

以下のような方法も試してみたのですが、

AuthType Basic AuthName "Please enter username and password" AuthUserFile /path/to/.htpasswd AuthGroupFile /dev/null require valid-user SetEnvIf Request_URI "^/admin" admin_path <RequireAll> Require all granted Require not env admin_path <RequireNone> Require ip <IPアドレス> Require ip <IPアドレス> </RequireNone> </RequireAll>

除外したIPアドレスでアクセスした場合に
アクセス拒否(HTTP 403)ではなくBasic認証が求められてしまいます。
構文上そうなってしまうことはわかるのですが、
どうすれば解決するのかはわかりません。

初歩的な質問で申し訳ないのですが、
解決方法を教えていただけないでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

.htaccess ファイルを 2つのディレクトリに分けて設定するといいのではないでしょうか。

(DirectoryRoot)/.htaccess <RequireAll> Require all granted <RequireNone> Require ip <禁止するIPアドレス> Require ip <禁止するIPアドレス> </RequireNone> </RequireAll>
(DirectoryRoot)/admin/.htaccess AuthType Basic AuthName "Please enter username and password" AuthUserFile /path/to/.htpasswd AuthGroupFile /dev/null <RequireAll> Require valid-user <RequireNone> Require ip <禁止するIPアドレス> Require ip <禁止するIPアドレス> </RequireNone> </RequireAll>

(2022/03/17 16:14) 追記

Require expr でうまくまとめたかったのですが、わかりませんでした。
Require ip 箇所の設定が重複してしまいますが、/admin とそれ以外でそれぞれ <RequireAll> を設定するのはどうでしょうか。

(その1) SetEnvIf Request_URI "^/admin" admin_path <RequireAll> Require env admin_path Require valid-user <RequireNone> Require ip <禁止するIPアドレス> Require ip <禁止するIPアドレス> </RequireNone> </RequireAll> <RequireAll> Require not env admin_path Require all granted <RequireNone> Require ip <禁止するIPアドレス> Require ip <禁止するIPアドレス> </RequireNone> </RequireAll>
(その2) <If "%{REQUEST_URI} =~ m#^/admin#"> <RequireAll> Require valid-user <RequireNone> Require ip <禁止するIPアドレス> Require ip <禁止するIPアドレス> </RequireNone> </RequireAll> </If> <If "! %{REQUEST_URI} =~ m#^/admin#"> <RequireAll> Require all granted <RequireNone> Require ip <禁止するIPアドレス> Require ip <禁止するIPアドレス> </RequireNone> </RequireAll> </If>

投稿2022/03/17 05:20

編集2022/03/17 07:14
TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukoyu988

2022/03/17 06:10

TaichiYanagiya 様 お忙しいところご回答いただきありがとうございます。 > .htaccess ファイルを 2つのディレクトリに分けて設定するといいのではないでしょうか。 はい。基本的にはおっしゃる通りだと思うのですが、、 大変申し訳ありません。重要なことを書き忘れていました。 環境がSymfonyで構築したサイトでして 物理的なディレクトリが存在せず教えていただいた .htaccessをディレクトリでわける方法ではBasic認証をかけることができません。 そのため、下記のようなURIでBasic認証をかけるような方法を取っています。 SetEnvIf Request_URI "^/admin" admin_path
yukoyu988

2022/03/17 07:54

yukoyu988 様 早速別の方法をご提案いただきありがとうございます。 > Require ip 箇所の設定が重複してしまいますが、/admin とそれ以外でそれぞれ <RequireAll> を設定するのはどうでしょうか。 ありがとうございます!! 教えていただいた方法でやりたかったことを実現することができました。 RequireAllを併記する方法や、If文を使う方法に思い当たらず 無理にひとつにまとめようとしていたのがよくなかったようです。 yukoyu988 様もご指摘の通りRequire ipが重複してしまう点については気になりますが、 /adminについてはBasic認証がかかっているため必ずしもIPアドレス制限を設ける必要はないように感じたので 以下のような方法で実装したいと思います。 (/adminは管理画面のためにBasic認証をかけており、 IPアドレス制限はフロント画面への大量アクセスなど防ぐことを目的としています) SetEnvIf Request_URI "^/admin" admin_path <RequireAll> Require env admin_path Require valid-user </RequireAll> <RequireAll> Require not env admin_path Require all granted <RequireNone> Require ip <禁止するIPアドレス> Require ip <禁止するIPアドレス> </RequireNone> </RequireAll> お忙しいところ迅速にご回答いただきありがとうございました。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問