Динамические 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://cdn.example.com/images/button.png'); }

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

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

[EDIT]

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

Ответы

Ответ 1

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

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

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

И ваш класс

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

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

http://cdn.example.com/images/button.png

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

I.E.: style.css.php would contain:

.cool-button { background-image url(<?php echo $bgImgUrl;?>); }

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

Ответ 5

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

Вставьте этот файл в .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 и сохранит запросы на другие типы на вашем основном сервере.

Ответ 6

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

например.

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

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

например.

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

<?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";

?>

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