Вопрос или проблема
Я пытаюсь перенаправить запросы из моего размещённого файла index.html, которые ссылаются на внешние JavaScript и CSS ресурсы, на локальные JS/CSS файлы на моем сервере. То есть, мой index.html запрашивает script.js с foobar.com:
<script type="text/javascript" src="https://foobar.com/foo/scripts/script.js"></script>
и мой index.html не размещен на foobar.com.
Я хочу, чтобы index.html запрашивал мой локальный /js/script.js
вместо этого (не изменяя HTML файл).
Я попытался сделать это в .htaccess:
RewriteEngine On
# Перенаправить внешние запросы JavaScript на локальные файлы
RewriteCond %{REQUEST_URI} ^/foo/scripts/script\.js [NC,OR]
RewriteRule ^(.*)$ /js/$1 [L]
но это, похоже, не работает, index.html по-прежнему пытается получить доступ к script.js с https://foobar.com
Технически эти запросы не идут на мой сервер, так что возможно ли их поймать? Хотя они приходят из index.html, который размещен на моем сервере…
Технически эти запросы не идут на мой сервер, так что возможно ли их поймать? Хотя они приходят из index.html, который размещен на моем сервере…
Нет. Они никогда не достигают вашего сервера. То, что вы можете сделать, это использовать mod_substitute
для замены строк в содержимом, которое вы отправляете. Обратите внимание, что это создаст довольно значительную дополнительную нагрузку на сервер, так как ему нужно будет фактически сопоставлять и выполнять замены.
Ответ или решение
Для перенаправления запросов внешних JavaScript и CSS-ресурсов на локальные файлы на вашем сервере, вы не можете использовать стандартные правила перенаправления в файле .htaccess
, так как эти запросы идут напрямую к внешнему ресурсу и не проходят через ваш сервер. Однако есть возможность решить эту задачу с помощью модуля mod_substitute
Apache, который позволяет заменять строки в содержимом, отправляемом клиенту.
Вот как можно реализовать замену URL внешних ресурсов на локальные с помощью mod_substitute
:
-
Убедитесь, что модуль модуль
mod_substitute
включен. Вы можете проверить это, выполнив команду в терминале вашего сервера (если у вас есть доступ):apache2ctl -M | grep substitute
Если модуль не включен, добавьте его следующим образом:
sudo a2enmod substitute sudo service apache2 restart
-
Отредактируйте файл
.htaccess
для использованияmod_substitute
. Добавьте следующие строки в ваш файл.htaccess
, который находится в корневом каталоге вашего сайта:AddOutputFilter SUBSTITUTE .html .htm Substitute "s|https://foobar.com/foo/scripts/script.js|/js/script.js|n"
Здесь мы устанавливаем фильтр для обработки HTML-файлов и заменяем URL внешнего скрипта на путь к локальному файлу.
-
Настройте сервер для обработки заголовков. Учтите, что замена происходит на уровне контента. Кроме того, убедитесь, что браузеры не кэшируют старые версии скриптов, чтобы избежать загрузки внешнего ресурса. Для этого можно добавить к заголовкам
Cache-Control
такие параметры:Header set Cache-Control "no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires "0"
-
Проверьте правильность работы. После внесения изменений проверьте, что при загрузке вашего
index.html
запрос кhttps://foobar.com/foo/scripts/script.js
заменяется на/js/script.js
. Это можно сделать через инструменты разработчика в вашем браузере, в вкладке «Сеть» (Network).
Таким образом, с помощью модуля mod_substitute
вы сможете перенаправить внешний ресурс на локальный файл, не изменяя сам index.html
. Обратите внимание, что такая реализация может увеличить нагрузку на сервер, так как каждая страница будет обрабатываться для замены.