Другие веб-сайты не могут загружать изображения с моего сайта, когда я использую перенаправления

#php #image #redirect #upload #http-headers

#php #изображение #перенаправление #загрузка #http-заголовки

Вопрос:

У меня есть веб-сайт, на котором есть изображения с такими URL-адресами:

 http://mysite.com/image1.jpg
  

Мой сервер использует php для перенаправления на поддомен, который содержит фактический файл, например:

 header('Location: http://images.mysite.com/image1.jpg');
  

Это отлично работает практически для всех целей, например, в теге img или при сохранении файла локально. Два URL-адреса по существу эквивалентны для этих целей. Однако, когда я захожу на сайт с загрузчиком изображений, например, tumblr или imgur, и пытаюсь загрузить первый URL-адрес, происходит сбой (сообщение «Ошибка при загрузке фотографии» или «Формат изображения не поддерживается, или изображение повреждено».).

Есть ли способ заставить это работать? Я пытался отправлять разные заголовки статуса, но они не помогли.

Редактировать:

Как было предложено, я мог бы сделать это с помощью перенаправления htaccess или путем открытия файла и отправки содержимого. Это будет работать нормально, за исключением того, что я не хочу, чтобы это происходило, когда пользователи используют файлы для других целей, например, для встраивания в тег img. Это потому, что мой images.mysite.com домен — это cdn для размещения моего графического контента, и это противоречило бы его цели, если бы мне пришлось резервировать контент с моего веб-сервера. И htaccess нежизнеспособен, потому что я хотел запустить некоторые PHP-скрипты при первом запросе URL.

Если бы я мог каким-то образом определить, когда он используется через загрузчик файлов, тогда я мог бы обрабатывать другие случаи отдельно. Но я не думаю, что смогу это обнаружить, не так ли?

РЕДАКТИРОВАТЬ 2 (РЕШЕНИЕ):

Хорошо, я пошел на хитрый компромисс: оказывается, что запросы на загрузку обычно не имеют параметра «accept_charset» в заголовке, тогда как запросы на встраивание имеют. Используя это, я могу определить, когда изображение запрашивается для загрузки, а затем я загружаю это изображение и отправляю содержимое. Не надежное решение, но оно работает достаточно хорошо. Спасибо, ребята!

Комментарии:

1. Они могут быть эквивалентны для конечных пользователей, но загрузчики изображений ожидают файл, а не перенаправление.

Ответ №1:

Похоже, что ваш сайт для загрузки изображений не отслеживает сделанное вами перенаправление. Итак, чтобы это работало, вместо перенаправления вы должны открыть удаленный файл и отправить его содержимое.

Комментарии:

1. Я не уверен в этом на 100%, но разве перезаписи .htaccess не могут быть использованы?

2. Да, переписывание URL должно выполнить работу. На самом деле он не отправляет клиенту перенаправление заголовка.

3. htaccess будет работать, но я хотел сделать некоторые вещи php во время перенаправления (например, ведение журнала и другие вещи).

4. .htaccess выполнит точно такое же перенаправление заголовка, как он хочет, за исключением кода результата.

Ответ №2:

Вы не можете заставить это работать, потому что службы загрузки изображений ожидают фактического файла изображения, они не следуют никаким перенаправлениям.

Ответ №3:

Вы не должны использовать стандартный код результата (200 — OK) с перенаправлениями заголовков.

Взгляните на это руководство о том, как отправлять коды результатов.

Ответ №4:

Как уже говорилось в других постерах, службы загрузки изображений считывают данные, возвращаемые вашим URL

 http://mysite.com/image1.jpg
  

в виде файла изображения — вот почему перенаправление сбивает с толку эти службы.

Почему бы вместо перенаправления не использовать PHP-скрипт, который считывает изображение из внешнего источника, а затем распечатывает двоичные данные? Вы можете выполнить это с помощью файла .htaccess, который ищет что-либо с «.jpg» в запросе.

Комментарии:

1. Это сработало бы, но тогда это будет выполняться для каждого запроса (а не только для загрузки файлов), что лишило бы цели размещения его на поддомене (который является cdn). Если бы я мог сделать это только для загрузки файлов, это было бы здорово, но многие люди также будут встраивать изображения в теги img, и я не хочу каждый раз заново загружать все изображения с моего cdn на мой сервер.

2. В этом случае вы можете сделать что-то вроде mysite.com/upload/image1.jpg будет выводить данные и mysite.com/image1.jpg будет сделано перенаправление.