Как правило, не рекомендуется обслуживать защищенные файлы из корня документа. Специально, когда пользователям необходимо войти в систему, чтобы просмотреть/получить к ним доступ. Когда вы делегируете обслуживание веб-серверу, вы теряете способность программно проверять, зарегистрирован ли пользователь, поскольку веб-сервер Apache не знает, проверяется ли пользователь в вашем приложении PHP. Как только пользователь узнает о URL-адресе файла, она может получить доступ к файлу без входа в систему.
Существует обходное решение, которое я проведу. Но я настоятельно рекомендую вам разместить файлы за пределами вашего веб-сайта и разработать сценарий для их доставки при доступе. Таким образом, вы можете проверить аутентифицированный и авторизованный сеанс при работе с файлом.
Однако, если вы настаиваете на том, чтобы идти этим путем, существует обходное решение. Давайте выложить пример структуру каталогов:
/path/to/web/document/root
├── manual
│ └── .htaccess
│ └── file1.pdf # protected
│ └── file2.pdf # protected
│ └── file3.epub # protected
├── documentation.php
├── listing.php # protected
└── .htaccess
Вы хотите файлы в каталоге manual/
быть защищены, а доступ только когда пользователи регистрируются в системе. Таким образом, вы положили директивы ниже в файле manual/.htaccess
:
RewriteEngine on
RewriteRule^/documentation.php [R]
# Your own rewrite rule has a syntax error and
# causes a 500 internal error
Это перенаправлять все запросы к documentation.php
файла в родительском каталоге. Снимите флаг R
, если вам не нужна внешняя перенаправление.
Как вы уже сказали, проблема в том, что любой запрос к файлам внутри manual/
перенаправляется в файл документации.
Обходным путем является проверка заголовка HTTP_REFERER
и убедитесь, что запрос поступает из файла listing.php
.
RewriteEngine on
# Feel free to change example.com with your own domain
RewriteCond %{HTTP_REFERER} !^http://www.example.com/listing.php$
RewriteRule^/documentation.php [R]
Таким образом, любой прямой запрос manual/file2.pdf
приведет к перенаправлению documentation.php
, но если пользователь нажимает на ссылку в listing.php
она может получить доступ к файлу без каких-либо проблем.
Если вам нужно сделать условие реферер более общий характер, обратитесь к этой статье:
Referrer Checking with .htaccess
быть предупрежден that a user can easily spoof the HTTP_REFERER
header и, таким образом, доступ к файлам без необходимости быть авторизованы. Единственный реальный пуленепробиваемый способ реализации этого - это то, что я сказал в начале этого сообщения.
Возможно, вы также захотите защитить каталог manual/
, используя базовый http auth. Но таким образом пользователям необходимо ввести другую комбинацию имени пользователя и пароля для доступа к этой папке.
И распечатка php работает, если вы отбрасываете htaccess? Я так не думаю. – sepehr
Да. Почему ты так думаешь? –
Поскольку 'opendir' открывает каталог, даже если веб-сервер выдает 500 внутренних ошибок. Вы проверили журналы ошибок? – sepehr