Страница 1 из 1

Как настроить отдачу статики?

Добавлено: 2016-07-18 15:09:56
Духовитин
Добрый день Товарищи!

У меня к вам такой вопрос. Понадобилось раздавать с веб-сервера статические файлы разные. Но проблема в том, запрос на отдачу файла даётся посредством php скрипта. Условно ссылкой вида: http://server.ru/getfile.php?id=xxx
Знаю, что отдавать файлы средствами php - зло, и хочу поэтому сделать всё правильно и красиво. Скажите есть ли пути, чтобы в php отрабатывалась вся логика по проверке доступа/типу и т.п., а затем бы отдча файла производилась силами веб-сервера?

Как настроить отдачу статики?

Добавлено: 2016-07-18 18:36:15
Neus
Вэбсервер nginx?

Как настроить отдачу статики?

Добавлено: 2016-07-18 21:00:01
Духовитин
Уважаемый, но ведь не в том вопрос.
Не в выборе веб сервера, а в пути которым от ссылки вида: http://сервер/id=fileID, где fileID - это идентификатор файла в БД. С последующим выдиранием информации об этом файле из БД, после этого уже только есть информация о реальном пути этого файла в ФС, чтобы этот путь передать или в функцию file_fet_contents() или что я и хочу узнать - как отдать этот путь веб-серверу, чтобы он уже отдал клиенту этот файл с диска.

Как настроить отдачу статики?

Добавлено: 2016-07-19 5:42:13
Amadeus
Духовитин писал(а): Условно ссылкой вида: http://server.ru/getfile.php?id=xxx
Знаю, что отдавать файлы средствами php - зло, и хочу поэтому сделать всё правильно и красиво. Скажите есть ли пути, чтобы в php отрабатывалась вся логика по проверке доступа/типу и т.п., а затем бы отдча файла производилась силами веб-сервера?
Духовитин писал(а): после этого уже только есть информация о реальном пути этого файла в ФС, чтобы этот путь передать или в функцию file_fet_contents() или что я и хочу узнать - как отдать этот путь веб-серверу, чтобы он уже отдал клиенту этот файл с диска.
а можно узнать чем провинился PHP что вы через него хотите отдавать что то?) PHP - интерпретируемый язык программирования, и без веб сервера + mod_php/fastcgi (cgi не пишу, так как это не для серьезных вещей) хоть миллиард php строк остаются буквами.

Отдачей статики ВСЕГДА занимается веб сервер. Другой вопрос как и какой. Посему у Вас во втором посту правильно спросили.

Тут два варианта (c использованием nginx, как наиболее правильного средства отдачи стат файлов):
1) И наиболее правильный, если у вас файло, имеет ряд всем известных расширений, и это отражено в урлах то:

Код: Выделить всё

    location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf) {
        root $static_dir;
        expires 30d;
        more_clear_headers 'Server';
        add_header Server Hello;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block;";
        add_header Strict-Transport-Security "max-age=31536000";

        gzip on;
        gzip_min_length 1100;
        gzip_buffers 4 8k;
        gzip_comp_level 9;
        gzip_types text/plain text/html text/css image/jpeg application/javascript image/png;
    }
Это как пример, тут чуть более сложная конструкция - но суть понятна.

2) Если у вас программисты - марсиане, и сделали стат файлы аля http://server.ru/getfile.php?id=тут набор символов без расширения

То либо
getfile.php

Обрабатывайте вот этот локейшн и потом тоже самое, либо ловите реквест ури - и потом так же тоже самое

Как настроить отдачу статики?

Добавлено: 2016-07-19 7:28:42
Neus
Духовитин писал(а): как отдать этот путь веб-серверу, чтобы он уже отдал клиенту этот файл с диска.
сформировать из пути урл
отдать урл клиенту, а клиент сам инициирует скачивание файла с веб-сервера
по-моему это так работает

Как настроить отдачу статики?

Добавлено: 2016-07-19 9:18:37
Духовитин
Ладно попробую объяснить ещё.

1. Файлы для отдачи клиентам лежат вне папке DOCUMENT_ROOT'а веб-сервера.
2. Файл можно скачать только если клиент удовлетворяет неким критериям (авторизован, есть доступ в скачиваемому файлу и т.п.)
3. Критерии на основании которых принимается решение о возможности/невозможности скачивания находятся в БД. Что-то типа:

Код: Выделить всё

Table users (
   id SERIAL,
   userName
)
Table files (
   id SERIAL,
   File_FS_Path
)
Table userFile (
  id SERIAL,
  userID BIGINT,
  fileID BIGINT,
  isAllowed TINYINT,
  FK (userID) -> users(id),
  FK(fileID) -> files(id)
)
Amadeus писал(а): 1) И наиболее правильный, если у вас файло, имеет ряд всем известных расширений, и это отражено в урлах то:
Проблема с тем, чтобы давать клиенту ссылку на статический файл вида: http://server/static_file.pdf в том, что в этом случае не работает схема с определением возможности/невозможности доступа к файлу.
Neus писал(а): сформировать из пути урл
отдать урл клиенту, а клиент сам инициирует скачивание файла с веб-сервера
Точно так же не работает схема с разграничением доступа. Этот единожды сформированный урл на статический файл, считай доступен всем и всегда.

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

Отправлено спустя 5 минут 29 секунд:
Не в обиду мужики, но вы с высоты своих знаний похоже разучились слышать других.
Сам похоже нашёл решение. http://forum.shelek.ru/index.php/topic,30362.0.html
Попробую, но похоже то, что надо.

Отправлено спустя 11 минут 19 секунд:
Ещё более конкретно решение вот: https://habrahabr.ru/post/37686/

Как настроить отдачу статики?

Добавлено: 2016-07-19 14:15:22
Amadeus
Духовитин писал(а): 1. Файлы для отдачи клиентам лежат вне папке DOCUMENT_ROOT'а веб-сервера.
2. Файл можно скачать только если клиент удовлетворяет неким критериям (авторизован, есть доступ в скачиваемому файлу и т.п.)
3. Критерии на основании которых принимается решение о возможности/невозможности скачивания находятся в БД. Что-то типа:
А где это было написано в условии изначальном?) Чуть корректнее описывайте условие. А не "отдать через php" *)

То что вы изначально написали и то что в итоге оказалось - две разные вещи