# CDN für .js und .css

**URL:** <https://forum.shopware.com/t/cdn-fur-js-und-css/44635>\
**Category:** Programmierung\
**Created:** [20. März 2017 um 07:36 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635 "2017-03-20T07:36:15Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![eroticforme](https://avatars.discourse-cdn.com/v4/letter/e/ba9def/32.png) [@eroticforme](https://forum.shopware.com/u/eroticforme)\
**Post date:** [20. März 2017 um 07:36 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/1 "2017-03-20T07:36:15Z")

</div>

Hallo aus der Schweiz

&nbsp;

Ich habe in der config.php die&nbsp;‚mediaUrl‘ =\> ‚[https://e4me.cdn-service.ch/](https://e4me.cdn-service.ch/)‘ drin stehen.

Damit erreiche ich, dass sämtliche Inhallte vom Ordner /media vom&nbsp;cdn service ausgegeben werden.

Wie kann ich erreichen, dass auch Bilder vom Ordner /themes sowie sämtliche .js und .css über CDN laufen?

Grüsse&nbsp;

---

<div class="post-metadata">

**Author:** ![hhmarco73](https://avatars.discourse-cdn.com/v4/letter/h/ed8c4c/32.png) [@hhmarco73](https://forum.shopware.com/u/hhmarco73)\
**Post date:** [20. März 2017 um 19:06 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/2 "2017-03-20T19:06:04Z")

</div>

Ich habe mir dafür ein kleines Shopware 5.2 Plugin geschrieben. Ohne Gewähr:&nbsp;

Datei custom/plugins/Cdn/Cdn.php:

&nbsp;Datei custom/plugins/Cdn/Subscriber/Cdn.php

```
cdnConfig = $cdnConfig;
    }
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Plugins_ViewRenderer_FilterRender' => 'onFilterRender'
        ];
    }

    /**
     * @param Enlight_Event_EventArgs $args
     *
     * @return string
     */
    public function onFilterRender(Enlight_Event_EventArgs $args)
    {
        $content = $args->getReturn();

        if (false === isset($this->cdnConfig['backend']) || 'local' !== $this->cdnConfig['backend']) {
            return $content;
        }

        if (true === isset($this->cdnConfig['adapters']['local']['replace'])) {
            $keys = array_keys($this->cdnConfig['adapters']['local']['replace']);
            $values = array_values($this->cdnConfig['adapters']['local']['replace']);
            $content = str_replace($keys, $values, $content);
        }
        return $content;
    }
}

```

Datei custom/plugins/Cdn/Resources/services.xml

```
            %shopware.cdn%

```

Datei config.php (replace ggf. erweitern bzw. mit anderen Werten arbeiten)

```
$cdn = 'https://www.test.com';
$config['cdn'] = [
        'backend' => 'local',
        'adapters' => [
            'local' => [
                'type' => 'local',
                'mediaUrl' => $cdn .'/',
                'path' => realpath( __DIR__. '/'),
                'replace' => [
                    'href="/web/cache/' => 'href="' . $cdn .'/web/cache/',
                    'href="/engine/Shopware/Plugins/' => 'href="' . $cdn .'/engine/Shopware/Plugins/',
                    'src="/web/cache/' => 'src="' . $cdn .'/web/cache/',
                    'src="/engine/Shopware/Plugins/' => 'src="' . $cdn .'/engine/Shopware/Plugins/',
                    'src="/themes/' => 'src="' . $cdn .'/themes/',
                    'srcset="/themes/' => 'srcset="' . $cdn .'/themes/',
                    'content="/themes/' => 'content="' . $cdn .'/themes/'
                ]
            ]
        ]
    ];

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![eroticforme](https://avatars.discourse-cdn.com/v4/letter/e/ba9def/32.png) [@eroticforme](https://forum.shopware.com/u/eroticforme)\
**Post date:** [21. März 2017 um 15:32 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/3 "2017-03-21T15:32:31Z")

</div>

Cool vielen Dank! 🙂

&nbsp;

---

<div class="post-metadata">

**Author:** ![malzfons](https://avatars.discourse-cdn.com/v4/letter/m/58956e/32.png) [@malzfons](https://forum.shopware.com/u/malzfons)\
**Post date:** [21. März 2017 um 15:47 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/4 "2017-03-21T15:47:27Z")

</div>

Wozu ist das gut mit CDN?

Kenne ich nämlich noch nicht.

Gruss

Matthias&nbsp;

&nbsp;

---

<div class="post-metadata">

**Author:** ![eroticforme](https://avatars.discourse-cdn.com/v4/letter/e/ba9def/32.png) [@eroticforme](https://forum.shopware.com/u/eroticforme)\
**Post date:** [21. März 2017 um 16:04 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/5 "2017-03-21T16:04:01Z")

</div>

Statische Elemente auslagern damit diese parallel geladen werden und somit schneller 😉

---

<div class="post-metadata">

**Author:** ![CM\_Design](https://avatars.discourse-cdn.com/v4/letter/c/6bbea6/32.png) [@CM\_Design](https://forum.shopware.com/u/CM_Design)\
**Post date:** [23. Mai 2017 um 14:02 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/6 "2017-05-23T14:02:07Z")

</div>

Hallo und vielen Dank für den Code.

Ich habe das kleine Plugin aus den Posts zusammengebaut, die config.php (mit meiner CDN-Adresse) angepasst und das Plugin aktiviert.

Allerdings tut das Plugin überhaupt nichts. 😉 Fehlt hier noch etwas? Denn Fehler produziert es schon mal nicht.

Meine schon vorher per CDN gelieferten Bilder kommen weiterhin aus dem CDN, .css und .js, wie z.b. Modernizr werden jedoch lokal und per relativem Pfad abgerufen.

&nbsp;

---

<div class="post-metadata">

**Author:** ![hhmarco73](https://avatars.discourse-cdn.com/v4/letter/h/ed8c4c/32.png) [@hhmarco73](https://forum.shopware.com/u/hhmarco73)\
**Post date:** [24. Mai 2017 um 10:25 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/7 "2017-05-24T10:25:04Z")

</div>

Caches (inkl. Themes) gelöscht? Wäre ad hoc das Einzige, was mir einfällt. Es scheint ja so bei mind. zwei Leuten zu funktionieren.&nbsp;

---

<div class="post-metadata">

**Author:** ![CM\_Design](https://avatars.discourse-cdn.com/v4/letter/c/6bbea6/32.png) [@CM\_Design](https://forum.shopware.com/u/CM_Design)\
**Post date:** [24. Mai 2017 um 11:35 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/8 "2017-05-24T11:35:46Z")

</div>

Danke, aber ja. Das ist inzwischen schon mehrfach geschehen ^^ Hilft leider nichts.

---

<div class="post-metadata">

**Author:** ![hhmarco73](https://avatars.discourse-cdn.com/v4/letter/h/ed8c4c/32.png) [@hhmarco73](https://forum.shopware.com/u/hhmarco73)\
**Post date:** [26. Mai 2017 um 06:34 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/9 "2017-05-26T06:34:31Z")

</div>

Liegt der Shop ggf. in einem Unterordner? Also z. B. [www.domain.de/shop](http://www.domain.de/shop) ? Dann muss das replace entsprechend angepasst werden.

Des Weiteren ggf. prüfen, ob der Listener auch greift. Einfach mal ein echo „TEST“ und exit in&nbsp;onFilterRender einbauen, den cache löschen und Seite aufrufen. Es sollte dann nur TEST auf der Seite ausgegeben werden.&nbsp;

---

<div class="post-metadata">

**Author:** ![CM\_Design](https://avatars.discourse-cdn.com/v4/letter/c/6bbea6/32.png) [@CM\_Design](https://forum.shopware.com/u/CM_Design)\
**Post date:** [12. Juni 2017 um 10:19 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/10 "2017-06-12T10:19:34Z")

</div>

Hallo zurück,

Inzwischen haben wir das Plugin so durchgeprüft.

Das Ergebnis: Der Listener greift nicht. Wir haben es mit einer Testausgabe und anschließendem EXIT probiert, aber aber passiert leider rein garnichts.

Um genau zu sein: echo „test“; exit; direkt nach dem onFilterRender.

Sieht irgend jemand den generellen Fehler im Plugin?

---

<div class="post-metadata">

**Author:** ![hhmarco73](https://avatars.discourse-cdn.com/v4/letter/h/ed8c4c/32.png) [@hhmarco73](https://forum.shopware.com/u/hhmarco73)\
**Post date:** [12. Juni 2017 um 11:27 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/11 "2017-06-12T11:27:46Z")

</div>

Ich habe noch mal drüber geguckt, statt

> Datei custom/plugins/Cdn/Resources/service.xml

müsste&nbsp;es

> Datei custom/plugins/Cdn/Resources/services.xml

sein&nbsp;

---

<div class="post-metadata">

**Author:** ![tgreiner](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/tgreiner/32/13964_2.png) [@tgreiner](https://forum.shopware.com/u/tgreiner)\
**Post date:** [12. Dezember 2018 um 13:30 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/12 "2018-12-12T13:30:09Z")

</div>

Moin!

Ich hab die hier beschriebene Möglichkeit für ein CDN seit längerem in zwei Shops laufen. Nun habe ich bei einem neuen Shop (5.5.4) das Problem, dass zB. beim Kompilieren des Templates folgende Meldung kommt:

"Während der Bearbeitung von Shop “XY” ist ein Fehler aufgetreten: The option “replace” does not exist. Defined options are: “dir”, “file”, “mediaUrl”, “permissions”, “root”, “type”, “url”.

Die config.php sieht aus wie folgt:

```
 [
	    'host' => 'XXX',
	    'port' => 'XXX',
	    'username' => 'XXX',
	    'password' => 'XXX',
	    'dbname' => 'XXX',
  ],
  'cdn' => [
	  'backend' => 'local',
	  'adapters' => [
		  'local' => [
			  'type' => 'local',
			  'mediaUrl' => $cdn . '/',
			  'path' => realpath( __DIR__. '/'),
			  'replace' => [
				  'href="/web/cache/' => 'href="' . $cdn .'/web/cache/',
				  'href="/engine/Shopware/Plugins/' => 'href="' . $cdn .'/engine/Shopware/Plugins/',
				  'href="/themes/' => 'href="' . $cdn .'/themes/',
				  'src="/media/' => 'src="' . $cdn . '/media/',
				  'src="/web/cache/' => 'src="' . $cdn .'/web/cache/',
				  'src="/engine/Shopware/Plugins/' => 'src="' . $cdn .'/engine/Shopware/Plugins/',
				  'src="/themes/' => 'src="' . $cdn .'/themes/',
				  'srcset="/themes/' => 'srcset="' . $cdn .'/themes/',
				  'content="/themes/' => 'content="' . $cdn .'/themes/'
			  ]
		  ],
	  ],
  ],
);

```

Kann es sein, dass nur noch bestimmte Keys vorkommen können und replace deshalb nicht mit übernommen wird? Und was kann man tun?

Ich freue mich über Antwort!

Grüße  
Thorsten

---

<div class="post-metadata">

**Author:** ![hhmarco73](https://avatars.discourse-cdn.com/v4/letter/h/ed8c4c/32.png) [@hhmarco73](https://forum.shopware.com/u/hhmarco73)\
**Post date:** [18. Januar 2019 um 08:28 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/13 "2019-01-18T08:28:22Z")

</div>

Habe den letzten Beitrag erst jetzt gesehen und auch nur, da ich nach “The option “replace” does not exist.” gegoogelt habe :D&nbsp;

Ich habe den ‘replace’ Part jetzt unter einem eigenen Key direkt im Root des config Arrays abgelegt

```
$config['plugin_cdn'] = [
        'replace' => [
            'href="/web/cache/' => 'href="' . $cdnUrl .'/web/cache/',
            'href="/engine/Shopware/Plugins/' => 'href="' . $cdnUrl .'/engine/Shopware/Plugins/',
            'src="/web/cache/' => 'src="' . $cdnUrl .'/web/cache/',
            'src="/engine/Shopware/Plugins/' => 'src="' . $cdnUrl .'/engine/Shopware/Plugins/',
            'src="/themes/' => 'src="' . $cdnUrl .'/themes/',
            'srcset="/themes/' => 'srcset="' . $cdnUrl .'/themes/',
            'content="/themes/' => 'content="' . $cdnUrl .'/themes/',
        ],
    ];

```

services.xml dann:

```
            %shopware.cdn%
            %shopware.plugin_cdn%

```

Und der Subscriber dann:

```
cdnSwConfig = $cdnSwConfig;
        $this->cdnPluginConfig = $cdnPluginConfig;
    }
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Plugins_ViewRenderer_FilterRender' => 'onFilterRender'
        ];
    }

    /**
     * @param Enlight_Event_EventArgs $args
     *
     * @return string
     */
    public function onFilterRender(Enlight_Event_EventArgs $args)
    {
        $content = $args->getReturn();

        if (false === isset($this->cdnSwConfig['backend']) || 'local' !== $this->cdnSwConfig['backend']) {
            return $content;
        }

        if (true === isset($this->cdnPluginConfig['replace'])) {
            $keys = array_keys($this->cdnPluginConfig['replace']);
            $values = array_values($this->cdnPluginConfig['replace']);
            $content = str_replace($keys, $values, $content);
        }
        return $content;
    }
}

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![Getzoo](https://avatars.discourse-cdn.com/v4/letter/g/f4b2a3/32.png) [@Getzoo](https://forum.shopware.com/u/Getzoo)\
**Post date:** [21. Mai 2019 um 12:04 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/14 "2019-05-21T12:04:53Z")

</div>

Ich würde das ganze gerne wieder pushen, da ich gerne die Medieninhalte via CDN laden würde. Zurzeit baue ich meinen Shop um, von Magento auf Shopware. Magento kann dies von sich aus, hier leider nicht. Bin dann auf dieses Thema gestoßen und hab eigentlich alles so gemacht wie oben geschrieben, sobald ich die Config aber hochaden zeigt der Shop nur noch das an: HTTP ERROR 500

```
 [
    'host' => 'xxx.mydbserver.com',
    'port' => 'xxx',
    'username' => 'xxx',
    'password' => 'xxx',
    'dbname' => 'xxx',
	],
	
    'csrfProtection' => [
        'frontend' => false,
        'backend' => true,
    ],
	
	$config['plugin_cdn'] = [
        'replace' => [
            'href="/web/cache/' => 'href="' . $cdnUrl .'/web/cache/',
            'href="/engine/Shopware/Plugins/' => 'href="' . $cdnUrl .'/engine/Shopware/Plugins/',
            'src="/web/cache/' => 'src="' . $cdnUrl .'/web/cache/',
            'src="/engine/Shopware/Plugins/' => 'src="' . $cdnUrl .'/engine/Shopware/Plugins/',
            'src="/themes/' => 'src="' . $cdnUrl .'/themes/',
            'srcset="/themes/' => 'srcset="' . $cdnUrl .'/themes/',
            'content="/themes/' => 'content="' . $cdnUrl .'/themes/',
        ],
    ];

);

```

Vielleicht einen Tipp woran es liegen könnet? Benutzt wird Shopware 5.5.8, ansonsten hab ich die Datein aktualisiert wie von&nbsp;[hhmarco73](https://forum.shopware.com/profile/24323/hhmarco73)&nbsp;geschrieben.

---

<div class="post-metadata">

**Author:** ![musikdiscount24](https://avatars.discourse-cdn.com/v4/letter/m/ac8455/32.png) [@musikdiscount24](https://forum.shopware.com/u/musikdiscount24)\
**Post date:** [21. Mai 2019 um 12:34 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/15 "2019-05-21T12:34:30Z")

</div>

Hallo @Getzoo‍,

hier findest du eine config im Default-Zustand:

[https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Configs/Default.php](https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Configs/Default.php)

Da kann man auch schön sehen, wie der Aufbau mal grundsätzlich ist. Ein Plugin (wie weiter oben beschrieben) ist u.U. nicht mehr notwendig.

Vielleicht hilft Dir das schon weiter.

Viele Grüße

P.S. Es dürfte sich um das zweite Semikolon (nach der eckigen Klammer)&nbsp;handeln, das den Fehler verursacht.

---

<div class="post-metadata">

**Author:** ![shyim](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/shyim/32/7681_2.png) [@shyim](https://forum.shopware.com/u/shyim)\
**Post date:** [21. Mai 2019 um 21:23 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/16 "2019-05-21T21:23:53Z")

</div>

Schau dir Mal&nbsp;[https://store.shopware.com/en/frosh31872894918f/performance-improvements.html](https://store.shopware.com/en/frosh31872894918f/performance-improvements.html) an. Da gibt’s eine Plugin Config für

---

<div class="post-metadata">

**Author:** ![Getzoo](https://avatars.discourse-cdn.com/v4/letter/g/f4b2a3/32.png) [@Getzoo](https://forum.shopware.com/u/Getzoo)\
**Post date:** [22. Mai 2019 um 06:40 UTC](https://forum.shopware.com/t/cdn-fur-js-und-css/44635/17 "2019-05-22T06:40:15Z")

</div>

[https://media.domain.de/](https://media.domain.de/)

Die Domain zeigt auf html/shop/media  
wenn ich die Domain aufrufe kommt “error 400 - bad request” somit denke ich, passt das.

Die Config sieht dann wie folgt aus:

&nbsp;

```
'cdn' => [
        'backend' => 'local',
        'strategy' => 'md5',
        'liveMigration' => false,
        'adapters' => [
            'local' => [
                'type' => 'local',
                'mediaUrl' => 'https://media.domain.de',
                'permissions' => [
                    'file' => [
                        'public' => 0666 & ~umask(),
                        'private' => 0600 & ~umask(),
                    ],
                    'dir' => [
                        'public' => 0777 & ~umask(),
                        'private' => 0700 & ~umask(),
                    ],
                ],
                'root' => realpath( __DIR__. '/../../../'),
            ],

```

&nbsp;

Das Plugin werde ich mir auch anschauen, mir gehts nur darum die Bilder etwas schneller laden zu können, da die Browser nicht so viele Requests pro Domain verarbeiten können und das ganze besser bei&nbsp;PageSpeed Insights darsteht.

Wenn ich nun die obere condig benutze, bekomme ich wieder den HTTP ERROR 500
