Разграничение доступа к файлам

Обсуждение любых вопросов связанных с файлами конфигурации .htaccess

Разграничение доступа к файлам

Сообщение bj3 » Пт авг 25, 2017 9:08 am

На сервере имеются папки и файлы:
/public/ - для файлов с открытым доступом
/private/ - для файлов с закрытым доступом
/.htaccess
/index.php

Все запросы к виртуальной папке /files/ должны вести к папке /public/.
Например:
Код: выделить все
http://site.ru/files/image.jpg --> /public/image.jpg
http://site.ru/files/dir/image.jpg --> /public/dir/image.jpg


Все запросы к виртуальной папке /myfiles/ должны вести в скрипт index.php, который будет самостоятельно раздавать файлы из папки /private/.
Например:
Код: выделить все
http://site.ru/myfiles/image.jpg --> index.php
http://site.ru/myfiles/dir/image.jpg --> index.php


При этом возможность на прямые запросы к папкам /public/ и /private/ должна отсутствовать, а запросы вести в скрипт index.php.
Например:
Код: выделить все
http://site.ru/public/image.jpg --> index.php
http://site.ru/private/dir/image.jpg --> index.php


Все вышеописанные условия должны выполняться одновременно.

Вопрос:
1) Возможно ли такое сделать (я не смог, но я не специалист по htaccess)?
2) Если возможно, то как?
3) Если невозможно, то какой альтернативный способ решения задачи вы бы предложили?

Заранее спасибо.
bj3
 
Сообщений: 3
Зарегистрирован: Пт авг 25, 2017 8:19 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Emilien » Пт авг 25, 2017 10:45 am

/.htaccess
Код: выделить все
RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(public|private)/  /index.php [L]

RewriteRule ^files/(.*)$ /public/$1 [L]
RewriteRule ^myfiles/    /index.php [L]
Emilien
Мл. Сержант
 
Сообщений: 51
Зарегистрирован: Чт дек 10, 2015 3:35 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение bj3 » Пт авг 25, 2017 12:12 pm

Emilien писал(а):/.htaccess
Код: выделить все
RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(public|private)/  /index.php [L]

RewriteRule ^files/(.*)$ /public/$1 [L]
RewriteRule ^myfiles/    /index.php [L]


Работает. Спасибо добрый человек.

Еще просьба проверить правильность инструкции для случая, когда имеется несколько доменов и для каждого из них свои папки файлов:
/domain1/public/
/domain1/private/
/domain2/public/
/domain2/private/
/.htaccess - общий для всех доменов
/index.php - общий для всех доменов

Код: выделить все
RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?test1\.ru$ [NC]
RewriteRule ^robots\.txt$ /domain1/public/robots.txt [L]
RewriteCond %{HTTP_HOST} ^(www\.)?test1\.ru$ [NC]
RewriteRule ^favicon\.ico$ /domain1/public/favicon.ico [L]
RewriteCond %{HTTP_HOST} ^(www\.)?test1\.ru$ [NC]
RewriteRule ^files/(.*)$ /domain1/public/$1 [L]

RewriteCond %{HTTP_HOST} ^(www\.)?test2\.ru$ [NC]
RewriteRule ^robots\.txt$ /domain2/public/robots.txt [L]
RewriteCond %{HTTP_HOST} ^(www\.)?test2\.ru$ [NC]
RewriteRule ^favicon\.ico$ /domain2/public/favicon.ico [L]
RewriteCond %{HTTP_HOST} ^(www\.)?test2\.ru$ [NC]
RewriteRule ^files/(.*)$ /domain2/public/$1 [L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(domain1|domain2)/(public|private)/    /index.php [L,QSA]
RewriteRule ^myfiles/    /index.php [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$    index.php [L,QSA]


Возможно ли как-то улучшить (сократить) такую запись? Можно ли записать в переменную (RewriteMap) имя папки распознанного домена, а потом подставлять в RewriteRule? Еще не понятно, как это все будет работать при http и https, нужно ли что-то специально дописывать. Спасибо.
bj3
 
Сообщений: 3
Зарегистрирован: Пт авг 25, 2017 8:19 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Emilien » Пт авг 25, 2017 5:23 pm

/etc/apache2/map.txt
Код: выделить все
www.test1.ru  domain1
test1.ru      domain1
www.test2.ru  domain2
test2.ru      domain2


Код: выделить все
RewriteMap domains "txt:/etc/apache2/map.txt"


/.htaccess
Код: выделить все
RewriteRule ^(?|files/(.*)|(robots\.txt|favicon\.ico))$  /${domains:%{HTTP_HOST}}/public/$1 [L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(domain1|domain2)/(public|private)/    /index.php [L,QSA]
RewriteRule ^myfiles/    /index.php [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$    index.php [L,QSA]


RewriteMap должен быть в <VirtualHost> или прямо в httpd.conf, так что использовать можно только на выделенном сервере, когда есть доступ к настройкам Apache.

Если это обычный шаред хостинг и нет доступа к httpd.conf, то RewriteMap можно эмулировать так:
Код: выделить все
RewriteCond "%{HTTP_HOST}  test1.ru=domain1 test2.ru=domain2" "^(?:www\.)?+(\S+) .*? \1=(\S+)"
RewriteRule ^(?|files/(.*)|(robots\.txt|favicon\.ico))$  /%2/public/$1 [L]


Всё одинаково доступно по https и http ничего дописывать не нужно.
Emilien
Мл. Сержант
 
Сообщений: 51
Зарегистрирован: Чт дек 10, 2015 3:35 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение bj3 » Сб авг 26, 2017 7:08 am

Emilien писал(а):

Сильно. Напишите, пожалуйста, мне на почту, чтобы не потерять с вами контакт.
bj3
 
Сообщений: 3
Зарегистрирован: Пт авг 25, 2017 8:19 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0


Вернуться в Htaccess

Кто сейчас на форуме

Зарегистрированные пользователи: нет зарегистрированных пользователей

cron