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

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

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

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

.htaccess

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

Q&A

解決済

2回答

8936閲覧

.htaccessでQueryString付きの特定URLに対してBASIC認証をかけたい

ryamamoto

総合スコア12

Apache

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

.htaccess

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

0グッド

0クリップ

投稿2016/06/28 07:38

.htaccessで、特定URL(QueryString付き)に対してBASIC認証をかけるようにしたいです。

(URL例)
http://example.com/products/detail.php?product_id=5

(サーバー)
Apache/2.2.15

(参考にしたページ)
http://qiita.com/hanamiche/items/8b9212df6a56d83152bb

DocumentRoot直下に、以下の.htaccessを作成して設置してみましたが、
URLページに対して、BASIC認証がかからず、普通にページが表示されてしまいます。

間違えている点やお気付きの点などがあれば、
教えていただけますと幸いです。
よろしくお願いいたします。


<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^/products/detail.php RewriteCond %{QUERY_STRING} product_id=5 RewriteRule (.*) $1 [E=admin_access:1] </IfModule>

<Files "products/detail.php">
Order allow,deny
Allow from All
Deny from env=admin_access

AuthUserFile /document_root/.htpasswd AuthGroupFile /dev/null AuthName "Administorator's Area" AuthType Basic require valid-user Satisfy Any
</Files>

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

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

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

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

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

guest

回答2

0

ベストアンサー

<Files> に指定するファイル名には、上位ディレクトリは含めることができないのではないでしょうか。
<Files "detail.php"> または <Files ~ "detail\.php$"> にするといいと思います。
/products/ 以下に限定したいのであれば、(docroot)/.htaccess ではなく、(docroot)/products/.htaccess で設定ください。

また、RewriteRule ですが、.htaccess でリライトした場合、もう一度ルールの先頭に戻って評価されるので、うまくいかない(2回目は product_id=5 が付かない→admin_accessが設定されない)と思います。
RewriteRule ^.*$ - [E=admin_access:1] でリライトしないようにするとうまくいくかもしれません。

(追記) ウソでした。ごめんなさい。
httpd.conf で OK、.htaccess で NG なので、RewriteRule が再評価されるからでは?と思ったのですが、違いました。「$1」でも「-」でもパスが変わらないので、リライト処理は終了します。
tanat さんの回答のとおり、先に「Deny from env=admin_access」が評価されるので、ダメみたい。

リライトの部分だけでも httpd.conf に設定するしかないと思います。

投稿2016/06/28 16:53

編集2016/06/30 00:22
TaichiYanagiya

総合スコア12141

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

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

ryamamoto

2016/06/29 13:19

なるほど!2回目のルール評価については見落としていました。ありがとうございます。 これでいけそうな気がしたのですが、まだ動きませんでした。 他に怪しそうな箇所がありましたら、教えていただけますと幸いです。 (docroot)/products/.htaccess ------------------------------------------------------------------------------- <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^/products/detail.php RewriteCond %{QUERY_STRING} product_id=5 RewriteRule ^.*$ - [E=admin_access:1,L] </IfModule> <Files "detail.php"> Order allow,deny Allow from All Deny from env=admin_access AuthUserFile /document_root/.htpasswd AuthGroupFile /dev/null AuthName "Administorator's Area" AuthType Basic require valid-user Satisfy Any </Files> -------------------------------------------------------------------------------
TaichiYanagiya

2016/06/30 00:20

httpd.conf で OK、.htaccess で NG なので、 RewriteRule が再評価されるからでは?と思ったのですが、違いました。ごめんなさい。 「$1」でも「-」でもパスが変わらないので、リライト処理は終了します。 tanat さんの回答のとおり、先に「Deny from env=admin_access」が評価されるので、ダメみたい。 リライトの部分だけでも httpd.conf に設定するしかないと思います。
guest

0

この.htaccessはmod_rewriteが有効になっていることが前提になっています。
参考URL Apache/mod_rewriteが使えるか確認する
を参考に、mod_rewriteが有効になっているか確認して頂くとどうなるでしょうか?

投稿2016/06/28 08:05

tanat

総合スコア18711

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

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

ryamamoto

2016/06/28 08:11

mod_rewriteは有効になっていました。 .htaccess の先頭に、参考URLのmod_rewirteを書き 存在しないURLにアクセスしてみた所、googleに飛ばされました。 .htaccess ----------------- <IfModule mod_rewrite.c> ErrorDocument 404 http://www.google.co.jp/ </IfModule> -----------------
tanat

2016/06/28 08:33

これだけではないと思いますが、 とりあえずファイル単位のbasic認証は.htaccessと同じディレクトリのファイルだけに有効だったはずなので、少なくともbasic認証に関する部分はproductsに.htaccessを新たに作る必要があるかと思います。
tanat

2016/06/29 03:12

色々試しましたが、認証プロセスの方がmod_rewriteより先に評価されるようでうまくいきません。。。 (PHPにたどり着くタイミングでは環境変数として与えられている) http://stackoverflow.com/questions/27893452/query-string-authentication-htaccess-apache や、 http://www.mikame.net/pr/archives/743 を見ていると(すみません、公式のドキュメントの該当箇所まで届きませんでした) どうにかしてSetEnvIfに引っかかるようにして頑張る。 みたいな感じかと思っています。 apache2.4系ならいけるのかも? http://stackoverflow.com/questions/11700058/use-basic-auth-based-on-query-string http://stackoverflow.com/questions/14648078/apache-permissions-based-on-querystring
ryamamoto

2016/06/29 13:47

参考ページありがとうございます! 私も色々試してみたのですが、 .htaccess では無く、httpd.conf に内容をコピペしてみたら、動きました。 httpd.conf ------------------------------------------------------------------------------- <VirtualHost *:80> DocumentRoot (docroot) <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^/products/detail.php RewriteCond %{QUERY_STRING} product_id=5 RewriteRule ^.*$ - [E=admin_access:1,L] </IfModule> <Files "detail.php"> Order allow,deny Allow from All Deny from env=admin_access AuthUserFile /document_root/.htpasswd AuthGroupFile /dev/null AuthName "Administorator's Area" AuthType Basic require valid-user Satisfy Any </Files> </VirtualHost> ------------------------------------------------------------------------------- .htaccess で実現したいのですが、どこか設定に不備があるのでしょうか?
tanat

2016/06/30 00:30

アップデートありがとうございます! .htaccessとconfでの挙動の違いをどう吸収するかですね・・・ 私ももう少し試してみます・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問