2016-01-03 3 views
0

желательно:htaccess: как перенаправить запрос в запрещенную папку?

  1. пользователь вызывает domain.tld/download/file_01.zip
  2. Htaccess называет private/download.php
  3. file_01.zip начинает загружать

Примечание: file_01.zip должен быть защищен от прямого доступа.

Упрощенная структура папки:

root/ 
    public/ 
     .htaccess 
     index.php 
    private/   <<< this area is blocked from direct access >>>   
     files/ 
      file_01.zip    
      file_02.zip 
     .htaccess 
     download.php 

общественности/.htaccess

RewriteRule ^download/(.*)?$ ./../private/download.php?file=$1 [NC,L] 

частный/.htaccess (Edit)

<IfModule !mod_authz_core.c> 
    Order deny,allow 
    Deny from all 
</IfModule> 
<IfModule mod_authz_core.c> 
    Require all denied 
</IfModule> 

download.php

$file = 'files/'.$_GET['file']; 

// check: user allowed to download? 
// check: more stuff (security, etc.) ... 

forceDownload($file); 

В RewriteRule работает, но я получаю сообщение об ошибке Forbidden: You don't have permission to access [...] on this server, вероятно, потому, что пользователя вызывает запрос, а не на сервер.

Любая идея? Спасибо заранее!

+0

Как вы блокируете доступ к каталогу 'private /'? – Darren

+0

@Darren Пожалуйста, посмотрите сейчас, я добавил содержимое 'private/.htaccess'. Я не могу изменить файл из-за обновления безопасности. –

+0

Если файл/каталог недоступен для Apache, вы не можете получить к нему доступ, _full stop_ – RiggsFolly

ответ

1

Существует еще один подход. Переименуйте конкретный каталог (добавьте одну точку перед ее текущим именем, например .private) и поместите это в файл .htaccess.

RewriteRule (^\.|/\.) - [F] 

После добавления этого правила, каждый файл и каталог, который начинается с один . будет запрещен/защищен, так же как .htaccess это самость. :)

Это предотвратит доступ для всех, кроме PHP, для открытия, просмотра, изменения содержимого файла/каталога.

Вот пример (очень распространенный, я считаю) базового .htaccess * (сидящего в каталоге DOCUMENT_ROOT) правил mod_rewrite.

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteRule (^\.|/\.) - [F] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+)$ /$1.php [QSA,L] 
</IfModule> 

После того, что это делается, вы не служат прямые ссылки на .zip или в зависимости от того файла доб. Вы имеете в виду, но делаете это каким-то другим способом с любимыми PHP-трюками Yours. :)

Если вы чувствуете, что это даст вам много рефакторинга кода, просто потому, что один каталог, вы можете добавить эти точки в zip-файлы и перемещать их в другом месте, прямой доступ к пунктирным файлам, по-прежнему не будет возможное.

1

As RiggsFolly stated in their comment.

Вам нужно изменить файл .htaccess private/ к чему-то вроде:

<IfModule !mod_authz_core.c> 
    Order deny,allow 
    Deny from all 
    Allow from 127.0.0.1 #or your server address/etc 
</IfModule> 

Вот еще одно решение, давая, что ваша версия Apache является >=2.4. (с использованием Require)

<IfModule !mod_authz_core.c> 
    Require all granted 
    Require ip 127.0.0.1 
</IfModule> 
Смежные вопросы