2013-08-13 3 views
4

Я разрабатываю инструмент, и я застрял на этом этапе: я хочу определить набор правил для каждой директории, в основном хочу только доступную папку «Public» и запретить доступ к другим папкам.Apache - запретить доступ ко всем каталогам, кроме общедоступных

Моя структура directoy является

uapi(root)/ 
    Application 
    Config 
    Public/ 
     Index.php 
    Storage 
    .htaccess 

и вот файл .htaccess

<Directory /Public> 
    Order Deny, Allow 
    Allow from all 
    <IfModule mod_rewrite.c> 
     Options +FollowSymLinks 
     RewriteEngine On 
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteCond %{REQUEST_FILENAME} !-d 
     RewriteRule ^(.*)$ Index.php/$1 [L] 
    </IfModule> 
</Directory> 

<Directory /Config> 
    Order Deny, Allow 
    Deny from all 
</Directory> 

<Directory /Application> 
    Order Deny, Allow 
    Deny from all 
</Directory> 

<Directory /Storage> 
    Order Deny, Allow 
    Deny from all 
</Directory> 
+0

Возможно, попробуйте удалить/прокомментировать директивы 'Rewrite ...', если это сработает, проблема там. – Pietu1998

+0

Я смотрел в access.log и его кеппы, говоря <

+1

, вообще говоря, если у вас есть контроль над сервером и вы не находитесь на общедоступном хостинге, добавьте этот материал в конфигурацию сервера (httpd.conf) лучше/быстрее, чем Apache не нужно искать и анализировать файлы .htaccess по каждому запросу. Если вы используете общий хостинг, вы застряли в методе .htaccess (в большинстве случаев) – Doon

ответ

7

В этом doc page говорит, вы не можете использовать директиву <Directory> внутри HTAccess, но только внутри файлов конф сервера.

В любом случае это не проблема в вашем случае: вы можете сохранить один файл .htaccess внутри каждого каталога, например. создать эти файлы:

Public/.htaccess

Order Deny, Allow 
Allow from all 
<IfModule mod_rewrite.c> 
    Options +FollowSymLinks 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ Index.php/$1 [L] 
</IfModule> 

/Config/.htaccess

Order Deny, Allow 
Deny from all 

/Application/.htaccess

Order Deny, Allow 
Deny from all 

/Storage/.htaccess

Order Deny, Allow 
Deny from all 
+1

Я знаю это, но есть ли какой-либо способ для всего этого из одного файла –

+0

Да, вы могли бы поместить все директивы, которые вы написали внутри виртуального хоста config или основной файл конфигурации Apache. См. Также: http://httpd.apache.org/docs/2.2/mod/core.html#virtualhost. –

+4

Downvote? Шутки в сторону? –

2

Вы можете делать все, что использование mod_rewrite себя от основного DOCUMENT_ROOT/.htaccess файла. Используйте этот код:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteRule ^(Application|Storage)(/.*|)$ - [NC,F] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^Public/(.*)$ /Public/Index.php/$1 [L,NC] 

Этот код будет бросать Запрещенный ошибку для всех запросов на /Storage/* или /Application/*, но позволит /Public/* обрабатываться /Public/index.php.

Смежные вопросы