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

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

ただいまの
回答率

88.92%

htaccessの参照元によるアクセス制限が効かない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 152

Naz.

score 13

現状

root
├ assets
│ ├ css
│ ├ js
│ │ ├ form.js
│ └ php
│    ├ PHPMailer
│    ├ .htaccess
│    └ form.php
└ index.html

上記のようなディレクトリで、『php』ディレクトリへのhtaccessでアクセス制限を掛けたいと思っています。
固有IPを取得していないため、すべてのアクセスを拒否した上で、『form.js』からのみ参照(※)できるようにしたいのですが、参照元からのアクセスが効きません。
お力添えいただけましたら、幸いです。

SetEnvIf Referer "^\.\./js/form\.js$" ref_ok
Order deny,allow
Deny from all
allow from env=ref_ok

※form.jsからのみ参照させたい理由※
index.htmlにメールフォームを置いており、ajaxの非同期通信でform.phpに$_POSTを渡し、jsonでform.jsに返すという処理をしています。

エラー

index.htmlのメールフォームから送信しようとすると、form.jsからのアクセスができずに、下記エラーが返ります。

403 (Forbidden)
[an error occurred while processing this directive] 要求されたオブジェクトへのアクセス権がありません。 読み込みが許可されていないか、 サーバが読み込みに失敗したかでしょう。 [an error occurred while processing this directive]

参考にしたもの

http://www.shtml.jp/htaccess/referer.html
https://teratail.com/questions/6219
https://teratail.com/questions/250375

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

etEnvIfじゃなくてSetEnvIfです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/07 18:35

    ありがとうございます。
    エスケープに自信がなさ過ぎて、そこに意識が向かってしまい
    脱字していることに全く気付きませんでした...

    そこは修正したんですが、結局、参照元からのアクセスもできていないようで、エラー内容が変わっただけでした。
    403 (Forbidden)
    [an error occurred while processing this directive] 要求されたオブジェクトへのアクセス権がありません。 読み込みが許可されていないか、 サーバが読み込みに失敗したかでしょう。 [an error occurred while processing this directive]

    キャンセル

  • 2020/07/07 18:50

    一旦この設定を外して、許可したいリクエストをして、アクセスログにリファラーがどう載っているか確認しましょう。
    比べる情報が無いので、正規表現が合っているかどうか不明。

    キャンセル

  • 2020/07/07 19:59

    ありがとうございます。
    ご助言にそって、一旦該当部分をコメントアウトし、アクセスログをとってみました。
    現状、まだローカル環境なのでホスト名には設定したヴァーチャルホストのホスト名が表示されています。

    xxx.x.x.x - - [07/Jul/2020:18:59:08 +0900] "POST /assets/php/form.php HTTP/1.1" 200 582 "http://(ホスト名)/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"

    ...参照元、jsファイルではないですね...?
    jsファイルにajax通信でform.phpのurlを記載したので、jsからのアクセスだと思っていたんですが
    jsファイルを読んでるindex.htmlがアクセス元になっているということなんでしょうか...?

    何はともあれ、併せて.htaccess側を下記2パターン試してみました。

    パターン①
    Order deny,allow
    Deny from all
    allow from ホスト名

    パターン②
    SetEnvIf Referer "http://ホスト名/" ref_ok
    Order deny,allow
    Deny from all
    allow from env=ref_ok

    結局、パターン①では動かなかったんですが、パターン②でメールフォームは動くようになりました。
    またform.phpを直接URLでたたいた時に、「アクセス権がありません」と出るようになったんですが、
    これは、ブラウザからのアクセスは拒否しつつ、自サイトのファイル経由でのアクセスはできるようになったという理解で良いんでしょうか?

    キャンセル

  • 2020/07/07 20:23

    ①は的外れですね。

    >これは、ブラウザからのアクセスは拒否しつつ、自サイトのファイル経由でのアクセスはできるようになったという理解で良いんでしょうか?

    トップページ経由のアクセスだけ許可すると言うことです。

    キャンセル

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

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

関連した質問

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