Динамические URL-адреса в CSS / JS

Я разделяю одно из своих более крупных приложений и представляю URL-адрес «cdn» для размещения общих объектов, таких как CSS, javascript и изображения, чтобы избежать дублирования. Однако мне нужно иметь отдельные URL-адреса для наших сред dev, поэтому у меня могут быть:

http://cdn-dev.example.com http://cdn-qua.example.com http://cdn.example.com 

в зависимости от того, в какой среде мы работаем. Я могу заставить это работать на вещи, которые генерируются нашим PHP-кодом, но я не могу потерять файлы .css и .js, которые будут вызваны. Например, как мне сделать что-то вроде:

 .cool-button { background-image: url('http://img.ruphp.com/php/button.png'); } 

переключаться между разными доменами?

Каков наилучший способ справиться с этим?

[РЕДАКТИРОВАТЬ]

Просто, так что все понятны, адрес CDN – это другой домен, который находится на сайте. Таким образом, сайт-разработчик может быть http://www-dev.domain.com, который будет использовать http://cdn-dev.domain.com

Используйте относительные пути, а не абсолютные пути. Когда внутри файла CSS, путь относится к файлу CSS, а не к HTML-странице.

Если ваш файл CSS находится здесь

 http://cdn.example.com/css/style.css 

И ваш класс

 .cool-button { background-image: url('../images/button.png'); } 

Затем браузер попытается загрузить изображение из

 http://img.ruphp.com/php/button.png 

Просто используйте домен-относительный URL-адрес?

 .cool-button { background-image: url('/images/button.png'); } 

Затем браузер будет выглядеть под текущим доменом.

Вы также можете создать процесс сборки и использовать шаблоны для создания файлов, специфичных для среды

например, в файле с именем yoursite.template.css

.cool-button {background-image: url ('@@ URL @@ / images / button.png'); }

создайте файл yoursite.css, а не замените @@ URL @@ на домен, который вы хотите.

В зависимости от конфигурации вашего сервера вы также можете добавить расширение .php к вашим именам файлов и также обработать их как PHP-скрипты:

 IE: style.css.php would contain: .cool-button { background-image url(<?php echo $bgImgUrl;?>); } 

Это также работает для JavaScript-файлов.

Я буквально сейчас работал над тем же, и вот что я придумал.

Вставьте это в свой .htaccess файл в корень вашего сайта. Это, очевидно, зависит от Apache и Mod_rewrite.

 RewriteEngine on RewriteBase / # Redirect content to the CDN RewriteCond %{HTTP_HOST} !^cdn\.server\.com$ [NC] RewriteRule .*\.(jpg|gif|png|flv|css|js|swf)$ http://cdn.server.com/$0 [R=301,L] 

Это отправит запросы на типы файлов в скобках в ваш cdn и сохранит запросы на другие типы на вашем основном сервере.

Ища ответ на этот вопрос, я увидел простой: создайте свой файл css с повторяющимися классами, один для сценария 1 (загрузка изображений из того же домена), а другой для сценария 2 (загрузка изображений с CDN).

например

 .container {background-image:url(my/site/image.png;)} .container-CDN {background-image:url(http://img.ruphp.com/php/image.png;)} 

Затем на вашем index.php введите PHP, чтобы вызвать правильный класс

например

 <body class="container<?PHP if ($whatever) {echo "-CDN";} ?>"> 

Если сервер такой же, вы можете использовать относительные пути. Как /http/blah/test/images/button.png или ../images/button.png

При использовании относительных URL-адресов вы можете заставить «базовый» URL-адрес. В теге <head> используйте <base href = "http://cdn-dev.example.com"&gt;. Затем каждая относительная ссылка «/style.css» будет указывать на « http://cdn-dev.example.com/style.css »,

Для справки: http://www.w3schools.com/TAGS/tag_base.asp

Ну … решение, которое я придумал, было … просто … хакерским, уродливым и немым. Но, черт возьми, это сработало:

 <?php if ($_SERVER['SERVER_NAME'] == "www.domain.tld") { $incs_path = "/usr/local/psa/home/vhosts/domain.tld/non-web-root-folder/private-files"; } else { $incs_path = "incs"; } require_once "$incs_path/$file-to-be-called.inc"; ?> 

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