Задать вопрос
@Ablovka

Как в .htaccess перенаправлять запросы в index.php при отсутствии папки или файла?

Пишу расширение для хрома на JS. Один из скриптов запрашивает картинки с одного домена, но защита JS выдает "No 'Access-Control-Allow-Origin'". Выход один - запрашивать со своего сайта и добавлять заголовок.

Идея следующая:
JS обращается к моему сайту:
"https://img.site.ru/images/user/avatar.gif" или "https://img.site.ru/items/item.png", сайт проверяет наличие изображений, при отсутствии создает папки, загружает и сохраняет изображения, затем возвращает изображение с заголовком 'Access-Control-Allow-Origin'

Можно ли через .htaccess проверить существование папок и файла, и при отсутствии, перенаправить на "https://img.site.ru/index.php?request='images/user...'", а лучше "https://img.site.ru/?request='images/user/avatar.gif'",
но что бы при обращении к "https://img.site.ru" выводилось index.php

В index.php будет обрабатываться $_GET["request"], создаваться папки и сохраняться изображения, для меньшей нагрузки на сайт, для которого пишу расширение.
Логика примерно следующая
spoiler

Точный синтаксис php не знаю, поэтому напишу как бы я сделал на JS:
if(!$_GET["request"] || typeof $_GET["request"] !== 'string') {
// перенаправляем на https://img.site.ru
} else {
    GetImg('images/img.png') // условное значение $_GET["request"]
    function GetImg(req){
        let path = req.split('/')
        let folder = ''
        for(let i = 0; i < path.length; i++){
            folder += '/' + path[i]
            if(!file_exists(folder)) { // проверка на существование папки / файла
                CreateFolder(folder, req)
                return
            } else {
                // выдать уже загруженное изображение
            }
        }
    }
}

function CreateFolder(folder, req){
    if(folder.split('.').length == 2 && folder == ('/'+req)){ // если нужные папки уже создались, но картинка не нашлась и folder == '/images/img.png'
        ImgDownloader(req)
        return
    } else {
        // создать папку 
    }
    GetImg(req)
}

function ImgDownloader(req){
    // загружаем картинку с другого домена (есть ли promise в php?)
    GetImg(req)
}



В PHP я полный ноль. Думаю ничего сложного в обработке таких запросов, но всё же попрошу следующих советов:
1. Есть ли лучшие идеи, чем мои? Я понимаю, что можно напрямую делать запрос к '/?request=''" и не заморачиваться с .htaccess, но такой вариант не красив.
2. Как лучше всего обработать ошибку и сделать перенаправление при ненужном или неправильном запросе?
3. Как обеспечить безопасность субдомена?
  • Вопрос задан
  • 36 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
Пропишите в htaccess
ErrorDocument 404 index.php
И потом смотрите в php, почему запрос промахивается по реквест параметрам.
PS: Вообще, я в такой задаче просто делаю отдельный скрипт download.php, и все запросы, связанные с получением файлов (не важно, своих или сторонних ресурсов) направляю туда, а уже внутренней логикой скрипта определяю, использовать ли кеш, скачать ли файл из первичного источника. Можно также проверить права доступа к файлу, если у вас есть авторизация пользователя, и нужно обеспечить доступ только к тем файлам, ограниченные правами пользователя.
Еще рекомендация, нужно как можно меньше светить путь такого хранилища в адресной строке, если у вас доступ по правам, лучше регистрировать местонахождение файла в базе данных и брать его id в качестве указателя, какой файл нужно получить через download.php.
Ответ написан
Комментировать
delphinpro
@delphinpro Куратор тега PHP
frontend developer
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

В index.php смотреть на $_SERVER['REQUEST_URI']
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы