Маршрутизация запросов изображений к отдельным поддоменам - PullRequest
2 голосов
/ 13 июня 2009

Сначала немного справочной информации:

Спецификация HTTP 1.1, около 1999 года, рекомендует, чтобы браузеры и серверы ограничивали параллельные запросы одним и тем же именем хоста до двух. ( более )

Если вы продолжите читать эту статью, автор предложит «одурачить» браузеры, указав несколько доменных поддоменов, указывающих на одно и то же.

Если бы я обслуживал мои изображения из двух отдельных поддоменов (двух разных имен хостов), то браузер загружал бы максимум 4 изображения параллельно (2 на имя хоста).

Учитывая это, теперь я мог бы равномерно распределить запросы между двумя поддоменами для оптимизации скорости загрузки страниц, например:

<img src="http://subdomain1.example.com/img1.jpg" />
<img src="http://subdomain2.example.com/img2.jpg" />
<img src="http://subdomain1.example.com/img3.jpg" />
<img src="http://subdomain2.example.com/img4.jpg" />

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


Я ищу гораздо более простое / многократно используемое решение, которое не включает видимых изменений в HTML.

У меня есть идея:

  1. Все похожие на изображения URL-адреса на [example.com] перенаправляются (через .htaccess) на [example.com/imghandler.php]
  2. imghandler.php перенаправляет на поддомен1 или поддомен2 - выбирается случайным образом.

Для иллюстрации:

# Request from browser:
>> http://example.com/dir/image.jpg

# Rewritten to:
>> http://example.com/imghandler.php?location=%2Fdir%2Fimage.jpg

# *Redirects* to either:
    1:
        >> http://subdomain1.example.com/dir/image.jpg
           (this is where the browser ends up getting the image from)
    2:
        >> http://subdomain2.example.com/dir/image.jpg
           (this is where the browser ends up getting the image from)

У меня есть два вопроса:

  1. С теоретической точки зрения это сработает?
  2. Есть ли лучший способ выполнить то, что я хочу?

Ответы [ 3 ]

5 голосов
/ 13 июня 2009

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

http://subdomain1.example.com/img1.jpg
http://subdomain2.example.com/img2.jpg
http://subdomain1.example.com/img3.jpg
http://subdomain2.example.com/img4.jpg

На одной странице затем:

http://subdomain2.example.com/img1.jpg
http://subdomain1.example.com/img2.jpg
http://subdomain2.example.com/img3.jpg
http://subdomain1.example.com/img4.jpg

На следующий.

Уловка, которую мы здесь используем, заключается в хешировании имени файла (GetHashCode в C #) и использовании его для выбора сегмента:

var serverNumber = image.GetHashCode() % serverCount;

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

0 голосов
/ 13 июня 2009
  1. Да. Это будет работать. Но вы получите в два раза больше запросов, по-прежнему ограничивая первый запрос, чтобы получить возможность перенаправления через основной домен два на два.

  2. Вы можете попробовать использовать JavaScript (он же jQuery), чтобы быстро изменить источник изображений в событии ready DOM до того, как изображения действительно начнут загружаться. Вы хотели бы использовать последовательный метод расчета того, какие из ваших опций субдомена использовать, чтобы будущие страницы, ссылающиеся на одно и то же изображение, приводили к изменению того же выбора субдомена.

0 голосов
/ 13 июня 2009

Вам лучше просто разместить все свои изображения на 1 сервере, а не делать 2 запроса на каждое изображение.

Если у вас есть динамическое содержимое страницы (то есть похоже, что вы используете php), вы можете получить тот же эффект и кодировать субдомены непосредственно в html, создав функцию, которая делает то же самое. Ваши теги изображений могут выглядеть так:

<img src="<?php echo image_root(); ?>/dir/image.jpg">

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

...