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

Я разрабатываю расширение для Chrome на JavaScript, и один из его скриптов пытается запрашивать изображения с определенного домена, но сталкивается с проблемой CORS, получая сообщение "No 'Access-Control-Allow-Origin'". Решение, которое я вижу, заключается в том, чтобы делать запросы к моему собственному сайту и добавлять нужный заголовок.

Суть моей идеи состоит в следующем: JavaScript обращается к моему сайту с URL, например, "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/avatar.gif'" или "https://img.site.ru/?request='images/user/avatar.gif'"? При этом, когда я обращаюсь к "https://img.site.ru", чтобы выводился файл index.php.

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

Я не сильно разбираюсь в PHP, и хотя мне кажется, что обработка таких запросов не должна быть сложной, я хотел бы получить несколько советов: 

1. Есть ли более эффективные или элегантные решения для реализации моей идеи? Я понимаю, что можно было бы просто делать запрос в формате '/?request=' и не усложнять задачу с .htaccess, но данный вариант не кажется эстетически привлекательным.
  • 27 февраля 2025 г. 23:34
Ответы на вопрос 2
Для вашей задачи можно использовать файл `.htaccess` для перенаправления запросов, если запрашиваемые файлы или папки не существуют. Это позволит вам обрабатывать запросы через `index.php`, где вы сможете проверять наличие изображения, загружать его при необходимости и возвращать с правильным заголовком.

Вот пример настройки `.htaccess`, который может вам помочь:

```apache
RewriteEngine On

# Убедитесь, что настройки для CORS включены
Header set Access-Control-Allow-Origin "*"

# Если файл или директория не найдены, перенаправляем на index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [QSA,L]
```

### Пояснение к коду:

1. **RewriteEngine On** — включает модуль перезаписи URL.
2. **Header set Access-Control-Allow-Origin "*"** — устанавливает заголовок CORS, разрешая запросы с любых источников. Вы можете изменить `*` на конкретные домены, если хотите ограничить доступ.
3. **RewriteCond %{REQUEST_FILENAME} !-f** — условие для проверки, если запрашиваемый файл не существует.
4. **RewriteCond %{REQUEST_FILENAME} !-d** — условие для проверки, если запрашиваемая директория не существует.
5. **RewriteRule ^(.*)$ index.php?request=$1 [QSA,L]** — если оба условия выполнены, перенаправляем запрос на `index.php`, передавая путь к запрашиваемому ресурсу в параметре `request`. 

### Обработка в `index.php`

Ваш `index.php` будет обрабатывать параметр `request`, проверять наличие файла или папки и, если необходимо, загружать изображение.

Пример такой обработки:

```php
<?php
// Получаем запрошенный путь
$request = isset($_GET['request']) ? $_GET['request'] : '';

// Полный путь к запрашиваемому файлу
$fullPath = __DIR__ . '/' . $request;

if (file_exists($fullPath)) {
    // Если файл существует, возвращаем его
    header('Content-Type: image/gif'); // Убедитесь, что указываете правильный MIME-тип
    readfile($fullPath);
} else {
    // Код для загрузки изображения
    $imageUrl = 'URL_К_Вашему_Изображению'; // Здесь нужно указать путь к изображению
    $imagePath = dirname($fullPath); // Папка, куда будет сохранено изображение

    // Создаем папку, если ее нет
    if (!is_dir($imagePath)) {
        mkdir($imagePath, 0755, true);
    }

    // Загружаем изображение
    file_put_contents($fullPath, file_get_contents($imageUrl));

    // Возвращаем только что загруженное изображение
    header('Content-Type: image/gif'); // Убедитесь, что указываете правильный MIME-тип
    readfile($fullPath);
}
?>
```

### Альтернативные решения:

- Если вы можете изменить способ работы вашего расширения, рассмотрите возможность использования прокси-сервера или наличия серверного решения, которое обрабатывало бы CORS-заголовки и управляло бы запросами к другим доменам. Это может быть более эффективным решением.
- Также вы можете рассмотреть использование AJAX-запросов с подходящими CORS-заголовками на стороне сервера, чтобы избежать некоторых шагов в пересылке изображений.

Ваше подход к обработке и сохраняемости изображений имеет смысл, однако всегда подумайте о производительности вашего сайта и возможных нагрузках, которые могут быть вызваны частыми запросами и загрузками.
Пропишите в htaccess 
ErrorDocument 404 index.php
И потом смотрите в php, почему запрос промахивается по реквест параметрам.
Похожие вопросы