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

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

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

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

Q&A

解決済

2回答

3650閲覧

.htaccessで画像など特定のファイルを拒否したいです。

dstrykn

総合スコア20

.htaccess

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

0グッド

0クリップ

投稿2018/10/01 06:06

編集2018/10/01 15:35

.htaccessに下記を記入し直リンクを拒否する設定にしました。

SetEnvIf Referer "^https://サイト名.jp" ref01 order deny,allow deny from all allow from env=ref01

これで拒否できましたがhtmlも拒否してしまうため、下記に変更しファイルを指定しましたが、表示されてしまいます。
どこが悪いのでしょうか。
.htaccessに詳しい方教えていただければ助かります。
宜しくお願い申し上げます。

SetEnvIf Referer "^https://サイト名.jp" ok_url <Files ~ ".(gif|jpe?g|png|pdf|pptx)$"> order deny,allow deny from all allow from env=ok_url </Files>

追記
↑の方法で拒否ができたのですが、
wordpressのプラグイン「ダウンロードマネージャー(ダウンロードリンクを作成できるプラグインです)」を使用しており、画像などのファイルへのリンクが作成されます。そのダウンロードリンクへのアクセスは可能となってしまいます。

ダウンロードマネージャーに作成されるリンクのアドレスを調べたところ、下記のような形式でした。
/download/パーマリンク名/?wpdmdlXXXX
downloadフォルダ内の?wpdmdlとつくアドレスと特定の(画像ファイルjpeg,pdfなど)を拒否にできないでしょうか。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

「表示されてしまいます」とおっしゃっているのは、
htaccessを変更しても「gifが直リンできてしまいました」という意味ですよね?

その設定で上手く出来るはずです。
直リンできてしまったことを確認するとき、どのように確認されましたか?
ブラウザのキャッシュに残ったものが表示されてしまっているだけではないでしょうか。

「?wpdmdlXXXX」の抑止について、QAからの追記です

ブラウザから
http://サイト/download/パーマリンク名/?wpdmdlXXXX
直たたきでファイルが取得できる状況という前提でお話しします。

「?wpdmdlXXXX」の部分はクエリパラメータなので<Files>ディレクティブ
ではコントロールできませんでした。(QAでの私の記載は誤りでした、すみません)

代わりにこれで試してみてもらえないでしょうか。
download/.htaccessの他の記述の後ろに書いて構いません。

<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} "wpdmdl" RewriteRule ^.*$ - [F,L] </IfModule>

WordPressの環境での対処(「ダウンロードページ」が表示されない)

WordPressの環境では、サイトのトップ(downloadの上)の.htaccessで
WordPressの仕組み上必要なmod_rewiteによるURL置換が行われています。
それによってdownloadページもdownloadリンクも、
一度サイトトップのindex.phpに転送されるようなイメージで実装されています。

また、mod_rewriteの書き換えを、親ディレクトリとサブディレクトリの両方で行う時、
サブディレクトリの書き換え条件にマッチする時は良いのですが、
マッチしない時は親ディレクトリの変換ルールを適用せずそこで変換終了してします。

そのため親ディレクトリに書かれている変換ルールが適用されず、
wordpressの仕組み上必要な置換(index.phpへの転送)が行われないため
上手くいきません。
(質問者さんの現象としては「ダウンロードページが表示されない」になる)

この場合の対処としては、2通り

(1) サブディレクトリの変換ルール内に、親ディレクトリの変換ルールも合わせて記述する。

(2) サブディレクトリに変換ルールを書かず、親ディレクトリに全ての変換ルールを記述する。

があります。
(1)の対処例として、downloadディレクトリの.htaccessを以下の様にしてみてください。

htaccess

1<IfModule mod_rewrite.c> 2RewriteEngine On 3RewriteCond %{QUERY_STRING} "wpdmdl" 4RewriteRule ^.*$ - [F,L] 5 6RewriteCond %{REQUEST_FILENAME} !-f 7RewriteCond %{REQUEST_FILENAME} !-d 8RewriteRule . /index.php [L] 9</IfModule> 10

当方テストできるWordPress環境は無いので、
不具合がある場合はご自分で適宜調整をお願いします。

投稿2018/10/01 06:41

編集2018/10/09 02:38
taka-saan

総合スコア665

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

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

dstrykn

2018/10/01 15:38

ご回答ありがとうございます。 調べたところ、おっしゃる通り拒否できていました。 状況の記述が足りませんでした。 質問に追記しましたが、wordpressのプラグイン「ダウンロードマネージャー(ダウンロードリンクを作成できるプラグインです)」を使用しておりまして、画像などのファイルへのリンクが作成されます。 そのダウンロードリンクへのアクセスが可能なので、このリンクと特定のファイルを拒否する方法を探しています。 ダウンロードマネージャーに作成されるリンクのアドレスを調べたところ、下記のような形式でした。 /download/パーマリンク名/?wpdmdlXXXX downloadフォルダ内の?wpdmdlとつくアドレスと特定の(画像ファイルjpeg,pdfなど)を拒否にできないでしょうか。
taka-saan

2018/10/02 01:10

画像ファイルに加えて、?wpdmdlとつくアドレスにも同じ制限をかけたい、ということでしょうか? Filesの""の中に正規表現を書けばよいだけですので、 ".(gif|jpe?g|png|pdf|pptx)$|?wpdmdl" で良いと思います。 「正規表現」でぐぐっていろいろ試してみてください。
dstrykn

2018/10/02 06:09

ご回答ありがとうございます。 試したみたのですが、ファイルは拒否できるのですが、ディレクトリの方はダウンロード拒否になりませんでした。 下記のように書いてみたのですが、2つに分けるとダメなのでしょうか。 "SetEnvIf Referer "^https://サイト名.jp" ok_url <Files ~ ".(gif|jpe?g|png|pdf|pptx)$"> order deny,allow deny from all allow from env=ok_url </Files> <Files "?wpdmdl"> Deny from all </Files>"
taka-saan

2018/10/02 09:17

だめではないです。 Filesの後ろに「~」を付けないと正規表現が使えず、ワイルドカードになります。 ?wpdmdl を含むURIをリファラに関わらず全て拒否したいのであれば <Files ~ "?wpdmdl"> Deny from all </Files> としてください。 https://httpd.apache.org/docs/2.2/ja/mod/core.html#files
dstrykn

2018/10/02 16:35

ご回答ありがとうございます。 試してみたのですが、ファイルは拒否できるのですが、ディレクトリの方はダウンロード拒否になりませんでした。 プラグイン「ダウンロードマネージャー(ダウンロードリンクを作成できるプラグインです)」が作成するアドレスは、"/download/パーマリンク名/?wpdmdlXXXX"です。 ”?wpdmdl”の後にプラグインが作成した文字がまだ続きます。downloadフォルダは本来存在せず、.htaccessを設置するために作成しています。 "SetEnvIf Referer "^https://サイト名.jp" ok_url <Files ~ ".(gif|jpe?g|png|pdf|pptx)$"> order deny,allow deny from all allow from env=ok_url </Files> <Files ~ "?wpdmdl"> Deny from all </Files>" この状況で他に対応策ないでしょうか?お手数をおかけいたしますがアドバイスお願いします。
taka-saan

2018/10/03 02:50

回答に追記しました
taka-saan

2018/10/03 07:53

すみません。 「?wpdmdlXXXX」の部分はクエリパラメータなので<Files>ディレクティブ ではコントロールできませんでした。(上での私の記載は誤りでした、すみません) 代替案はちょっと思いつきません。。。
taka-saan

2018/10/03 08:21

お詫びに代案考えました。。 とおもったらCHERRYさんと被ってしまった。。
taka-saan

2018/10/03 08:23

一応、WPではない環境で、テスト済みです。
dstrykn

2018/10/04 11:54

ご回答ありがとうございます。 検証もしていただいて、ありがとうございます。 早速試してみましたが、CHERRYさんに教えていただいた方法と同じ結果でした。 ダウンロードの直リンクは拒否できたのですが、ダウンロードの記事ページのアドレス(html)もなぜか拒否されます。 アドレスは"サイトドメイン/download/abc/"なので"wpdmdl"は入っていないので、理由がわからないのですが、他に考えられる方法はないでしょうか。
taka-saan

2018/10/04 13:49

ダウンロード記事ページのurlはそれで正確でしょうか。 元々wordpressの質問ではなかったですし、ダウンロードマネージャーとかの仕様は知らないので、要件が後から増えるのはつらいです。。 abcというディレクトリが既に存在してるってことは無いですよね??
dstrykn

2018/10/04 16:46

ごめんなさい。私も最初は.htaccessだけの問題だけかと思っていたもので... 「abcというディレクトリが既に存在してる」という意味がわからないのですが、 "サイトドメイン/download/abc/"はファイルをダウンロードするためのページです。(wordpressのカスタム投稿タイプのsingleページの扱いだと思います。) abcの部分は自由に決めれます。実際にabcというページを作った結果拒否されてしまいます。 他の文字でも同様でした。 また直リンクだけでなくサイト内リンクも拒否されてしいました。
taka-saan

2018/10/05 02:44

すみません、 本来無かったディレクトリである'/download'を手で作ってそこに.htaccessを置いた、とおっしゃっていたので、色々試しているうちに「/download/abc」も作ってしまっていた、ということは無いですよね?という意味でした。 原因の切り分けをしたいので、「/download」の下のディレクトリとファイルを.htaccessも含めてすべて削除していただいた上で、 正常系のテスト ・http://サイトドメイン/download/abc/ で「ダウンロードページ」が表示されるのか。 ・http://サイトドメイン/download/abc/?wpdmdlxxx でダウンロードができるのか。 ・(具体的なURLはご提示いただけていないのですが)ブラウザから画像ファイルが表示できるのか。 ・(具体的なURLはご提示いただけていないのですが)サイト内リンクが表示できるのか。 を**ブラウザキャッシュにご注意いただいて**試してみていただけませんか。 これらが表示できないのであればそもそもdownloadディレクトリを手で作ってはいけないことになると思います。 上記が正常に表示できる場合、 「ダウンロードマネージャ」が何かmod_rewriteの設定を行っていないか気になるので、 wordpressの.htaccess(サイトの直下にあると思います)をご提示いただけませんか。 よろしくお願いいたします。
taka-saan

2018/10/05 11:32

思ったのですが、 「ダウンロードページ」のURLが「http://サイトドメイン/download/abc/」であるというのは勘違いで、 実は「http://サイトドメイン/download/abc/?wpdmdl=hogehoge」なのではないでしょうか。 WPのエディタ上では隠蔽されていてわからないだけで。 いずれにしても上記のテストを正しく実施していただければわかると思います。。。
dstrykn

2018/10/06 16:42 編集

ご回答ありがとうございます。 サイト直下の.htaccessを確認したところ、サイト表示高速化の設定とwordpressの設置フォルダの設定がありました。wordpressの設置フォルダのが書いてあり、mod_rewriteがありますが、これが原因でしょうか。 <IfModule mod_deflate.c> SetOutputFilter DEFLATE AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript </IfModule> <IfModule mod_expires.c> ExpiresActive On <FilesMatch ".(css|js)$"> ExpiresDefault "access plus 1 week" </FilesMatch> <FilesMatch ".(gif|jpe?g|png)$"> ExpiresDefault "access plus 1 month" </FilesMatch> </IfModule> # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] 「原因の切り分けをしたいので、「/download」の下のディレクトリとファイルを.htaccessも含めてすべて削除していただいた上で、 正常系のテスト ・http://サイトドメイン/download/abc/ で「ダウンロードページ」が表示されるのか。 ・http://サイトドメイン/download/abc/?wpdmdlxxx でダウンロードができるのか。 ・(具体的なURLはご提示いただけていないのですが)ブラウザから画像ファイルが表示できるのか。 ・(具体的なURLはご提示いただけていないのですが)サイト内リンクが表示できるのか。」 は確認しましたが、ダウンロードページの表示、ダウンロード、全て問題ございませんでした。
taka-saan

2018/10/07 00:34

テストありがとうございました。 予想する原因ですが、mod_rewriteの書き換えを親ディレクトリとサブディレクトリ両方で行う時、マッチする時は良いのですがサブディレクトリの置換にマッチしない時はそこで変換終了してしまい、親のルールが適用されないために、wordpressの仕組み上必要な置換が行われないためだと思います。 親ディレクトリの方にルールを書いてしまうのが手っ取り早いです。 具体的なコードをご提示したいのですが、休み明けになってしまいます。
dstrykn

2018/10/07 04:35

ご回答ありがとうございます。mod_rightが原因でしたか。原因がわかって良かったです。お休み中にご回答ありがとうございます。休み明けで結構ですのでコードお待ちしております。よろしくお願いします。
taka-saan

2018/10/09 02:40

理由の説明と対処例を追記しました。
dstrykn

2018/10/09 10:02

ご回答ありがとうございます。少し修正させて頂き、やりたかったことが実現できました。本当に助かりました。ありがとうございました。 コードを一応残しておきます。(ファイルが入っているフォルダの拒否とダウンロードリンクが内部リンクの場合許可する設定を追加しました。) SetEnvIf Referer "^https://サイト名.jp" ok_url <Files ~ ".(gif|jpe?g|png|pdf)$"> order deny,allow deny from all allow from env=ok_url </Files> <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_REFERER} !^https://サイト名.jp RewriteCond %{QUERY_STRING} "wpdmdl" RewriteRule ^.*$ - [F,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
guest

0

QUERY_STRING でアクセス制御するとなると mod_rewrite と組み合わせるしか無いかな...

テストしていないのですが、こんな感じでどうでしょうか?
XXXX の部分はいろいろあるのかと思われたので、省略しています。

RewriteEngine On RewriteCond %{HTTP_REFERER} !^https://サイト名.jp RewriteCond %{QUERY_STRING} wpdmdl RewriteRule ^download/(.*) - [F,L]

RewriteRule Flags

投稿2018/10/03 08:06

編集2018/10/03 08:17
CHERRY

総合スコア25171

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

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

CHERRY

2018/10/03 08:09 編集

あ、.htaccess か。 < LocationMatch > 使えないな...  ファイルじゃ無いから <Files >もだめだし...
CHERRY

2018/10/03 08:15

あ、 F がつかえるのか。
dstrykn

2018/10/04 11:51

ご回答ありがとうございます。 早速試してみました。ダウンロードの直リンクは拒否できたのですが、ダウンロードの記事ページのアドレス(html)もなぜか拒否されます。 アドレスは"サイトドメイン/download/abc/"なので"wpdmdl"は入っていないのですが... これさえ解決できれば解決なのですが、他に考えられる方法はないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問