Falls Sie in Ihrer Drupal 8 Instanz obskure URI-Schemata benötigen und Sie Fehlermeldungen bezüglich ungültiger URI-Schemata erhalten, ist dieses Post für Sie gedacht.
Nehmen wir an, ein Kunde bittet Sie, irgendwo auf der Seite einen WhatsApp Share Link einzufügen. Der Code dafür könnte so ähnlich aussehen:
use \Drupal\Core\Url; Url:fromUri('whatsapp://send', [ 'query' => [ 'text' => 'Some text', ], ])->toString();
Das sollte funktionieren, denn die URI ist genau nach Spezifikation erstellt und somit gültig. Aber anstatt der erwarteten Ausgabe erhalten wir eine Fehlermeldung (oder eine weiße Seite):
InvalidArgumentException: The URI 'whatsapp://send' is invalid. You must use a valid URI scheme. Use base: for a path, e.g., to a Drupal file that needs the base path. Do not use this for internal paths controlled by Drupal. in Drupal\Core\Utility\UnroutedUrlAssembler->assemble() (line 64 of core/lib/Drupal/Core/Utility/UnroutedUrlAssembler.php).
Was ist denn da passiert? Drupal 8 pflegt eine Liste gültiger URI-Schemata, die bei der Erzeugung von URLs verwendet werden dürfen. Falls ein Schema nicht in dieser Liste von Protokollen ist, wirft Drupal diese Fehlermeldung. whatsapp
ist standardmäßig nicht in dieser Liste, also erkennt Drupal die URL als ungültig.
Das ist tatsächlich ein nettes Sicherheits-Feature, aber was, wenn wir nicht darum herum kommen, andere als die Standard-URI-Schemata zu unterstützen? Es ist ganz einfach und schnell gemacht, man muss nur wissen, wo man nachschauen muss. Die erlaubten Protokolle werden als Parameter an den Services Container übergeben. Der fragliche Parameter heißt filter_protocols
. Die Standardparameter für den Services Container stehen in der Datei default.services.yml
in Verzeichnis sites/default
Ihrer Drupal-Installation. Es gibt möglicherweise auch eine development.services.yml
-Datei mit Einstellungen nur für die Entwicklung und weitere. Falls Sie diese Standardeinstellungen ändern möchten, kopieren Sie die Datei default.services.yml
nach services.yml
und passen Sie die Einstellungen wie von Ihnen benötigt an. Um beispielsweise das whatsapp
Protokoll zu unterstützen, würden Sie das zu der Liste filtered_protocols
hinzufügen. Jetzt bauen Sie noch Ihren Container neu (z.B. in dem Sie drush cr
auf der Kommandozeile aufrufen) und die Fehlermeldung sollte verschwunden sein.
# Allowed protocols for URL generation. parameters: filter_protocols: - http - https - ftp - news - nntp - tel - telnet - mailto - irc - ssh - sftp - webcal - rtsp - whatsapp
Natürlich könnten Sie bei der Gelegenheit auch gleich andere Schemata, die Sie nicht benötigen, z.B. telnet
, entfernen, um die Sicherheit zu erhöhen ;).