Sylius supports multiple Channels, each associated with a dedicated hostname.
To enable page previews across different channels (and thus across different hostnames), this plugin must bypass security restrictions—but only in ways that are legitimate and permitted by the browser.
KernelResponseListener.php
To achieve this behavior, a listener is implemented in:
src/Event/KernelResponseListener.php
This listener sets two response headers that allow a page to be embedded in an iframe from another host:
Content-Security-Policy: frame-ancestors'self' <list-of-channel-hostnames>
where <list-of-channel-hostnames> is a space-separated list of all configured hostnames. MDN reference
Web Server Configuration
To ensure the KernelResponseListener works properly, make sure your web server does not override the Content-Security-Policy and X-Frame-Options headers.
🌍 Default Locale Behavior
Symfony defines a default locale, see config/services.yaml
config/services.yaml
1# Put parameters here that don't need to change on each machine where the app is deployed2# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration3parameters:4locale:en_US5
By default, Sylius requires each entity (and thus content blocks) to be translated at least in the default locale.
DegDitor respects this rule and allows adding blocks only if you're editing in the default locale.
For this reason, when editing a page, you'll always see the default locale in the locale dropdown - even if the current channel doesn’t include it.
Example:
You have two Channels: A and B
Default Locale: en_US
Channel A supports: en_US
Channel B supports: fr_FR, de_DE (but noten_US)
When editing a page in Channel B, you'll still see en_US in the list of locales, since it's the default locale.
This allows you to add blocks, even though en_US isn't technically part of Channel B.
👁️ Firewall Restrictions in Preview mode
Sylius uses Symfony firewall to control access to shop, admin and API routes.
The shop firewall uses a regular expression (defined by sylius.security.shop_regex) to match URLs based on the path only (query strings are ignored).
By default, this regex blocks access to those routes whose locale is not configured for the current channel.
So in the above example, trying to preview a page in en_US while editing in Channel B would fail - even though you're allowed to add blocks in en_US.
As a result, you might be able to edit the content, but not preview it.
Fix: Overwriting the Shop Regex
To fix this limitation, we override the default Sylius regex:
sylius.security.default_shop_regex: the original Sylius value
sylius.security.shop_regex: a custom regex that extends the original one to allow access to DegDitor pages in the default locale, even if not listed in the current channel.
This override ensures that previews work correctly across channels and locales.