Обслуживать статические ресурсы phpBB с другого сервера?

У phpBB много статических ресурсов, и их обслуживание с сервера, отличного от сервера динамического форума, может означать заметное увеличение производительности. Мы можем установить заголовки с истекающим сроком действия в далеком будущем и, возможно, использовать CDN в будущем.

Из проверок, которые я сделал до сих пор, кажется, что изменение functions.php для указания другого базового каталога может работать. Код

$web_path = '//some.new.domain/path'/*(defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? $board_url : $phpbb_root_path*/;

Однако мне неясно, может ли это иметь другие последствия, например сделать каталог загрузки недоступным, поскольку пути кажутся локальными для сервера. Кроме того, он не разрешает генерацию динамического CSS с помощью styles.php.

Есть ли быстрый способ указать изменения в статических ресурсах, не нарушая код phpBB?


person Collector    schedule 23.09.2014    source источник


Ответы (2)


Учитывая дату вашего вопроса, я предполагаю, что вы уже используете phpBB 3.1, и в этом случае вы можете написать расширение, которое делает то, что вы хотите, оставляет код phpBB нетронутым и не будет мешать обновлениям форума. Если нет, вы застрянете с модификацией кода или другими способами решения вашей проблемы.

Для 3.1 вам нужно будет написать плагин, который подключается к событию 'core.page_header_after', которое будет выполняться в конце функции page_header(). Это позволяет перезаписывать все переменные шаблона, созданные в заголовке, и добавлять новые, если вы хотите использовать другие в своих шаблонах.

В вашем случае вам нужно посмотреть, как назначить эти переменные.

'T_ASSETS_PATH'         => "{$forum_static_url}assets",
'T_THEME_PATH'          => "{$forum_static_url}styles/" . rawurlencode($this->user->style['style_path']) . '/theme',
'T_TEMPLATE_PATH'       => "{$forum_static_url}styles/" . rawurlencode($this->user->style['style_path']) . '/template',
'T_SUPER_TEMPLATE_PATH' => "{$forum_static_url}styles/" . rawurlencode($this->user->style['style_path']) . '/template',
'T_IMAGES_PATH'         => "{$forum_static_url}images/",
'T_SMILIES_PATH'        => "{$forum_static_url}{$this->config['smilies_path']}/",
'T_AVATAR_PATH'         => "{$forum_static_url}{$this->config['avatar_path']}/",
'T_AVATAR_GALLERY_PATH' => "{$forum_static_url}{$this->config['avatar_gallery_path']}/",
'T_ICONS_PATH'          => "{$forum_static_url}{$this->config['icons_path']}/",
'T_RANKS_PATH'          => "{$forum_static_url}{$this->config['ranks_path']}/",

Обратите внимание, что в приведенном выше примере я уже заменил обычный URL-адрес phpbb на переменную forum_static_url, которая может быть заполнена URL-адресом вашего домена, откуда вы хотите обслуживать статические файлы.

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

person Steven De Groote    schedule 03.08.2015

Если бы это было возможно, я бы не стал трогать код PhpBB, а скорее прибегнул бы к механизму перезаписи URL-адресов Apache.

В PHPBB3 большая часть статического содержимого (по размеру) находится в подкаталоге /assets/.

So if:

  • вы используете браузер с возможностью перезаписи,
  • включить .htaccess или аналогичный
  • и mod_rewrite или аналогичный установлен,

в файл .htaccess можно поместить,

Redirect permanent /assets http://mycdnhoster.com/collector/phpbb3/assets

Это позволяет очень легко включать/отключать CDN и не беспокоиться об изменении кода PhpBB.

То же самое касается статических файлов «стиль» и «тема». Существует имеет место небольшое снижение производительности, когда браузер по-прежнему обращается к вашему серверу только для того, чтобы вернуться в другое место, но с современными конвейерными браузерами это не является реальной проблемой. Кроме того, в большинстве случаев перенаправленный ресурс будет «запомнен» браузером, который больше не будет обращаться к вашему серверу (по крайней мере, в течение некоторого времени).

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

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

  • javascript с использованием "отложенной загрузки" или "добавочной/условной загрузки" для плагина и подобных функций.
  • Файлы CSS, содержащие ссылки на шрифты и фоновые изображения (url(../../../path/...)).

Также будьте осторожны, поскольку вы указали pagespeed, этот mod_pagespeed может быть несовместим с этим типом перезаписи URL, поскольку он будет анализировать HTML и пытаться сжать ресурсы, на которые он ссылается. Таким образом, вы можете получить все свои здоровенные CSS-файлы, выгруженные в CDN, и все равно загружаемые с вашего сервера, встроенные в оптимизированную, сжатую и трудно распознаваемую форму в вашем единственном mod_pagespeed'ed. локальная ссылка на CSS.

То есть в вашем html у вас есть

<link href="/app/small.css" ... />
<link href="/static/big.css" ... />
<link href="/static/big2.css" ... />

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

<link href="/app/small+big+big2.css?pagespeed&whatever" />

и он никогда не будет запрашивать что-либо в /static, никогда не будет перенаправлен, а вместо этого запросит и загрузит сжатый, оптимизированный, но все еще больший, чем вам хотелось бы, объединенный CSS с вашего сервера.

person LSerni    schedule 01.10.2014
comment
Спасибо, что уделили время этому подробному ответу, но я боюсь, что он не очень полезен и не отвечает на мой вопрос о том, где внести изменения в phpBB. Мы не используем Apache, и переадресация 301 никогда не бывает лучше, чем предоставление правильного ресурса, поскольку вы все равно делаете запрос к серверу. Переписывание HTML с помощью NginX может быть хорошим выбором, но, поскольку многие ресурсы относительны, я все равно сам во всем разберусь, так что это не полный ответ. CSS: лучше всего было бы объединить их все в один статический с измененными именами файлов. Так что спасибо, но здесь нет решения. - person Collector; 03.10.2014
comment
Я не уверен, что решение существует, если мы не упростим настройку и, по крайней мере, не откажемся от скорости страницы. Я даже не рассматривал другие вопросы, такие как CORS. Я помолчу об этом еще... - person LSerni; 03.10.2014
comment
Конечно, решение существует, и я начал его реализовывать, изменив код PhpBB (как я написал в своем вопросе). Однако, поскольку я предполагал, что кто-то другой мог сделать это в прошлом, я подумал, что такой вопрос, как здесь, может сэкономить мне (и другим, кто читает его позже) много времени на повторную реализацию того же самого. При чем тут CORS?!?! Мы просто меняем полученный HTML, чтобы включить статические ресурсы с другого сервера. Если страница из домена X включает JavaScript из домена Y, она все равно работает внутри домена X. - person Collector; 03.10.2014
comment
Обычно да. Но скрипт может загрузить дополнительный код (плагины и т. д.) и либо больше его не найти, либо искать его в другом домене и вызвать проблемы с тем же доменом. Большинство простых переписываний будет работать; но следует также учитывать, что для некоторых могут не потребоваться дополнительные обходные пути или могут потребоваться дополнительные обходные пути - это все, что я говорил. - person LSerni; 17.10.2015