file_put_contents (meta / services.json): Stream konnte nicht geöffnet werden: Berechtigung verweigert


168

Ich bin neu in Laravel. Ich habe versucht zu öffnen http://localhost/test/public/und ich habe

Fehler im Ausnahmebehandler.

Ich googelte herum und änderte die Berechtigung des Speicherverzeichnisses mit, chmod -R 777 app/storageaber ohne Erfolg.

Ich wechselte debug=>truein app.phpund besuchte die Seite und bekam Fehler in Exception - Handler:

Der Stream oder die Datei "/var/www/html/test/app/storage/logs/laravel.log" konnte nicht geöffnet werden: Stream konnte nicht geöffnet werden: Berechtigung in / var / www / html / test / bootstrap / compiled verweigert. PHP: 8423

Dann habe ich die Berechtigungen des Speicherverzeichnisses mit dem Befehl geändert chmod -R 644 app/storageund der Fehler 'Fehler im Ausnahmebehandler' war verschwunden und eine Seite wird geladen. Aber da drin bekomme ich folgendes:

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): Stream konnte nicht geöffnet werden: Berechtigung verweigert


2
sieht wieder wie ein Berechtigungsproblem aus, chmod rekursiv alle Anwendungsverzeichnisse
alou

@alou Ich denke, ich habe das bereits mit chmod -R 777 App / Speicher gemacht. Habe ich nicht Alle Verzeichnisse in der App haben die Berechtigung drwxrwxrwx.
Vishnub1626

33
Versuchen Sie: php artisan cache:cleardann chmod -R 777 app/storageendlichphp artisan dump-autoload
vsmoraes

@vsmoraes Es hat funktioniert. Es ist sehr hilfreich, wenn Sie erklären können, wo das Problem lag.
Vishnub1626

7
vsmoraes 'Kommentar war korrekt, aber anstelle von' php artisan dump-autoload 'sollte' composer dump-autoload 'lauten
Elliot Robert

Antworten:


320

Der Vorschlag von vsmoraes hat bei mir funktioniert:

Laravel> = 5,4

php artisan cache:clear 
chmod -R 777 storage/
composer dump-autoload

Laravel <5.4

php artisan cache:clear 
chmod -R 777 app/storage 
composer dump-autoload

HINWEIS: TUN SIE DAS NICHT AUF EINEM FERNSERVER (DEV ODER PRODUKTION)

Als ich diese Frage stellte, war dies ein Problem auf meinem lokalen Host, der in einer virtuellen Maschine ausgeführt wurde. Daher dachte ich, die Einrichtung eines 777 sei sicher genug, aber die Leute haben Recht, wenn sie sagen, Sie sollten nach einer anderen Lösung suchen. Versuchen Sie zuerst 775


8
Dies sollte sudo chmod -R 777 App / Speicher sein. um Berechtigungsfehler zu vermeiden.
Olaitan Mayowa

5
Für # Laravel5 sind die Anweisungen fast identisch: php artisan cache:cleardann chmod -R 777 storageund dann composer dump-autoload
WNRosenberg

6
Wenn Sie Laravel 5.1+ verwenden, müssen Sie dies chmod -R 777 storagestattdessen tun
James

10
php artisan cache:clearist die richtige Antwort. Dann sudo chmod -R ug+rw storagegibt die richtigen Berechtigungen für mich, ohne Angabe von othersLese- / Schreib oder insbesondere Privilegien auszuführen.
Zack Morris

43
Diese Antwort und dieser Thread unterstreichen, warum ich Laravel nicht so sehr mag: Sie lehrt Entwickler, dass Sie alles tun können, was Sie wollen, wann immer Sie wollen, so schnell Sie wollen, ohne über die Konsequenzen 777nachzudenken (ich verstehe, dass es nicht Laravel-spezifisch ist, aber Der Denkprozess für Laravel-Entwickler lautet: "Lass es JETZT funktionieren, es ist mir egal, wie", genau wie 777). Stellen Sie in der Regel niemals etwas ein 777, um etwas zum Laufen zu bringen. VERSTEHEN Sie Ihren Server und Ihre Benutzer / Rollen und stellen Sie sie entsprechend ein. Hack es nicht. Ihre Kunden vertrauen darauf, dass Sie dies richtig machen.
dKen

70

Für Googler, die mit Laravel 5 vor diesem Problem stehen.

Dies ist ein Berechtigungsproblem, das von verschiedenen Benutzern verursacht wird, die versuchen, storage/logsmit unterschiedlichen Berechtigungen in dieselbe Protokolldatei im Ordner zu schreiben .

Was passiert, ist, dass Ihre Laravel-Konfiguration wahrscheinlich so eingerichtet ist, dass Fehler täglich protokolliert werden. Daher kann Ihr Webserver (Apache / Nginx) diese Datei unter einem Standardbenutzer erstellen. Abhängig von Ihrer Umgebung kann dies etwa _wwwunter OSX- oder www-data* NIX-Systemen der Fall sein Wenn Sie möglicherweise einige Handwerkerbefehle ausgeführt haben und einige Fehler aufgetreten sind, schreibt der Handwerker diese Datei, jedoch mit einem anderen Benutzer, da PHP auf dem Terminal von einem anderen Benutzer ausgeführt wird, der tatsächlich Ihr Anmeldebenutzer ist. Sie können dies überprüfen, indem Sie diesen Befehl ausführen ::

php -i | grep USER

Wenn Ihr Anmeldebenutzer diese Protokolldatei auf Ihrem Webserver erstellt hat, können Sie keine Fehler darin schreiben und umgekehrt, da laravel 655standardmäßig Protokolldateien mit Berechtigungen schreibt, die nur dem Eigentümer erlauben, darin zu schreiben.

Um dieses Problem vorübergehend zu beheben, müssen Sie 664dieser Datei manuell Berechtigungen für die Gruppe erteilen, damit sowohl Ihr Anmeldebenutzer als auch Ihr Webserverbenutzer in diese Protokolldatei schreiben können.

Um dieses Problem dauerhaft zu vermeiden, möchten Sie möglicherweise die richtigen Berechtigungen einrichten, wenn eine neue Datei storage/logsim Verzeichnis erstellt wird, indem Sie die Berechtigungen aus dem Verzeichnis erben. Diese Antwort https://unix.stackexchange.com/a/115632 kann Ihnen dabei helfen Das.


fan-friggen-tastische Antwort hier! Ich verwende Elastic Beanstalk und mein Befehlszeilen-PHP-Benutzer ist "ec2-user", aber meine Anwendung wird als "webapp" ausgeführt.
Randy L

1
Eine Antwort, die das Problem erklärt. dh eine richtige Antwort.
Craicerjack

Dies half mir zu erkennen, warum ich in Laravel on Cloudways einen Datei-Cache-Fehler bekam. Ich musste die Schaltfläche im Cloudways-Bedienfeld drücken, um die Dateiberechtigungen zurückzusetzen. Vielen Dank.
Ryan

44

Sie sollten keine 777-Berechtigungen erteilen. Es ist ein Sicherheitsrisiko. Für Ubuntu-Benutzer in Laravel 5 empfehle ich, den Besitzer für die Verzeichnisspeicherung rekursiv zu ändern:

Versuchen Sie Folgendes:

sudo chown -R www-data:www-data storage

In Ubuntu-basierten Systemen sind www-Daten Apache-Benutzer.


2
Dies wurde für mich behoben und ist korrekter (glaube ich) als die chmod 777Antworten. Danke ~
GavinR

Ich denke, es ist die bequemste Antwort für Linux-Benutzer. Danke @GavinR. chmod 777ist ein Albtraum.
Abdalla Arbab

Dies funktionierte für mich und ist definitiv eine bessere Option als chmod -777
Egnaro

Vielen Dank für eine neue Art der Problemlösung! Müssen wir vor / nach Ihrem Befehl etwas tun, um die chmod 777Konsequenzen umzukehren ?
Aleksandar

41

Für alle, die Laravel 5, Homestead und Mac verwenden, versuchen Sie Folgendes:

mkdir storage/framework/views

Dies funktioniert auch mit der Erstellung eines neuen Servers mit Laravel Forge mit Laravel 5.2.7
Winkster

2
Das hat es für mich getan. Es scheint, bootstrap/cache/compiled.phpals hätte ich versucht, in dieses Verzeichnis zu schreiben, aber es war nicht vorhanden und hat einen Berechtigungsfehler ausgelöst. Danke dir.
Matt K

1
Irgendwie hat das bei mir geklappt. Ich benutze Laravel 5.1 übrigens
Yohanes Gultom

Das hat es für mich getan, danke. Ich hatte mein gesamtes Speicherverzeichnis entfernt und dachte, dies würde wieder von Laravel generiert, rate nicht.
Grimmdude

33

manchmal hat SELINUX dieses Problem verursacht; Sie können Selinux mit diesem Befehl deaktivieren.

sudo setenforce 0

Wow, ich habe wirklich den Trick gemacht und funktioniert. Kann mir jemand erklären, warum es funktioniert hat? Was ist Selinux?
undefinedman

Ja, das hat wirklich funktioniert! Bitte helfen Sie uns Guru, dies auf SELINUX zu verstehen. Ich benutze Fedora 24 übrigens
Loki9

1
Vielen Dank, vielen Dank. Ich suche im Internet und jeder sagt zu mir: Erlaubnis prüfen, Benutzer prüfen und so weiter ...
Ali ZahediGol

3
Dies ist im Grunde wie das Ausschalten der gesamten Firewall, da sie einen Port blockiert, den Sie öffnen mussten.
JoE

Ich hatte noch nie davon gehört. "Security-Enhanced Linux (SELinux) ist ein Linux-Kernel-Sicherheitsmodul, das einen Mechanismus zur Unterstützung von Sicherheitsrichtlinien für die Zugriffskontrolle bietet." Ich bezweifle, dass es eine gute Idee ist, es auszuschalten. Und ich wette, die Aufsteiger verwenden diesen Befehl blind, ohne die vollständigen Konsequenzen zu verstehen.
Ryan

18

Problem gelöst

php artisan cache:clear
sudo chmod -R 777 vendor storage

Dies ermöglicht die Schreibberechtigung für App, Framework und Protokolle. Ich hoffe, dies wird helfen


12
Niemals 777 ... in dev oder prod, da es die Illusion von Dingen gibt, die in dev funktionieren, aber sie werden in prod einbrechen, es sei denn auch 777, was niemals eine gute Idee ist
Kyle Burkett

wooha du rockst ... Verkäufer war derjenige, den ich vermisst habe
lu1s

Ja, irgendetwas in einem öffentlich zugänglichen Web 777 zu geben, ist eine schlechte Idee
imabug

17

GEBEN SIE ES NIEMALS DIE ERLAUBNIS 777!

Gehen Sie in das Verzeichnis des Laravel-Projekts auf Ihrem Terminal und schreiben Sie:

sudo chown -R your-user:www-data /path/to/your/laravel/project/
sudo find /same/path/ -type f -exec chmod 664 {} \;
sudo find /same/path/ -type d -exec chmod 775 {} \;
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

Auf diese Weise machen Sie Ihren Benutzer zum Eigentümer und gewähren Berechtigungen:
1 Ausführen, 2 Schreiben, 4 Lesen
1 + 2 + 4 = 7 bedeutet (rwx)
2 + 4 = 6 bedeutet (rw)
schließlich für den Speicherzugriff, ug + rwx bedeutet, dass Sie dem Benutzer und der Gruppe eine 7 geben


1
Ich weiß nicht, warum viele Entwickler gerne 777 verwenden ... irgendwie kümmerten sie sich nicht um ihr System.
ZeroOne

15

Für vagabundierende Benutzer lautet die Lösung:

(in vagrant) PHP Artisan Cache: klar

(außerhalb des Vagabunden) chmod -R 777 App / Speicher

(in vagrant) Komponist Dump-Autoload

Hier ist es wichtig sicherzustellen, dass Sie in Ihrer lokalen Umgebung und nicht in Vagabunden chmod!


6
ist 777 nicht zu offen?
Simo

3
Ich meine, für die Produktion sicher. Dies ist jedoch eine lokale Entwicklungsumgebung. 777 war das, was das Originalplakat verwendete, und andere Antworten.775 oder 755 können je nach Funktion funktionieren.
Brendan

12

Versuchen Sie es erneut mit chmod -R 755 /var/www/html/test/app/storage. Verwenden Sie mit sudo für Operation not permittedin chmod. Verwenden Sie Eigentümerberechtigung prüfen, wenn der Fehler weiterhin auftritt.


Funktioniert nicht. Alle Verzeichnisse in der App haben die Erlaubnis drwxrwxrwx
vishnub1626

@tav können Sie bitte Ihre Besitzerberechtigung für Ihren Testordner überprüfen?
Khay

Gleiches drwxrwxrwx. Das Problem wurde mit den Vorschlägen von @ vsmoraes gelöst (siehe Kommentare)
vishnub1626

4
chmod 777 ist ein Sicherheitsrisiko
Yogesh Kamat

9

Gemäß Laravel 5.4, dem neuesten Stand, während ich dies schreibe, müssen Sie die Berechtigung ändern, wenn Sie ein solches Problem haben. Hören Sie niemandem zu, der Ihnen sagt, dass Sie 777 für ein Verzeichnis einstellen sollen. Es gibt ein Sicherheitsproblem. Ändern Sie die Berechtigung des Speicherordners wie folgt

sudo chmod -R 775 storage

Ändern Sie die Berechtigung für den Bootstrap-Ordner wie folgt

sudo chmod -R 775 bootstrap/cache

Stellen Sie nun sicher, dass Sie beide Befehle aus Ihrem Anwendungsverzeichnis ausführen. Sie werden in Zukunft keine Probleme mit der Erlaubnis haben. 775 beeinträchtigt keine Sicherheit Ihrer Maschine.


7

Schlagen Sie die richtige Berechtigung vor, wenn für Apache,

sudo chown -R apache:apache apppath/app/storage

Laravel Forge Verwendung: Sudo Chown -R Schmiede: Schmiede ~ / Projekt / Speicher / Sudo Chown -R Schmiede: Schmiede ~ / Projekt / Bootstrap / Cache /
Flappy

6

Wenn Sie über Laravel 5 verfügen und eine dauerhafte Lösung suchen, verwenden Sie sowohl die php artisanBefehlszeilennutzung als auch den Apache-Server:

sudo chmod -R 777 vendor storage
echo "umask 000" | sudo tee -a /etc/resolv.conf
sudo service apache2 restart

Eine ausführliche Erklärung finden Sie hier .


8
Es scheint eine schlechte Idee zu sein, 777
Randy L

umask 000 in resolv.conf ?! Woher bekommen diese Leute diese Informationen? Das ist eine ungültige Zeile in der resolv.conf. Bitte ignorieren Sie diese und alle 777 "Lösungen" da draußen
higuita

Überprüfen Sie die URL und finden Sie keine Umask-Option in resolv.conf linux.die.net/man/5/resolv.conf
higuita

6

FÜR JEDEN, DER EIN Betriebssystem MIT SELINUX AUSFÜHRT: Die richtige Methode, um httpd das Schreiben in den Laravel-Speicherordner zu ermöglichen, ist:

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'

Dann, um die Änderungen sofort anzuwenden:

sudo restorecon -F -r '/path/to/www/storage'

SELinux kann ein Problem sein, aber wenn es vorhanden ist, würde ich Ihnen dringend raten, es zu lernen, anstatt es vollständig zu umgehen.


Mein genaues Problem in frischen Centos 7 war ähnlich. es hieß keine Erlaubnis zum Schreiben, aber alle waren 777 zum Testen. Dieser Beitrag hat mir also nach allen allgemeinen Überprüfungen tatsächlich Zeit gespart.
HumaN

1
Dies ist die richtige Lösung, obwohl ich denke, der richtige SELinux-Typ sollte httpd_sys_rw_content_t sein sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug

4

Ich hatte das gleiche Problem und die folgenden Schritte halfen mir, das Problem zu beheben.

  1. Finden Sie den Apache-Benutzer heraus - erstellte eine test.php-Datei im öffentlichen Ordner mit dem Code

<?php echo exec('whoami'); ?>

Führen Sie die Datei über den Webbrowser aus. Es würde dem Apache-Benutzer geben. In meinem Fall ist es ec2-user, da ich die aws mit cronjob in /etc/cron.d/ verwendet habe. Es könnte ein anderer Benutzer für andere sein.

  1. Führen Sie den folgenden Befehl in der Befehlszeile aus.

sudo chown -R ec2-user:<usergroup> /app-path/public

Sie müssen hier den richtigen "Benutzer" und die richtige "Benutzergruppe" identifizieren und verwenden.


4

Wenn Sie Linux oder Mac verwenden, können Sie auch in laufen ssh terminal. Sie können Terminal verwenden, um diesen Befehl auszuführen.

 php artisan cache:clear 
 sudo chmod -R 777 storage
 composer dump-autoload

Wenn Sie Windows verwenden, können Sie mit ausführen git bash.

 php artisan cache:clear 
 chmod -R 777 storage
 composer dump-autoload

Sie können das Git-Formular https://git-scm.com/downloads herunterladen .



2

Jedes Mal, wenn ich app.php ändere, erhalte ich eine Berechtigung, die das Schreiben von bootstrap / cache / services.json verweigert. Deshalb habe ich Folgendes getan, um das Problem zu beheben:

chmod -R 777 bootstrap/cache/

8
chmod 777 ist ein Sicherheitsrisiko
Yogesh Kamat


2

Die Erlaubnis auf 777 zu setzen ist definitiv eine schreckliche Idee!

... aber

Wenn Sie einen Berechtigungsfehler im Zusammenhang mit dem Ordner "Speicher" erhalten, hat dies bei mir funktioniert:

1) Setzen Sie die Berechtigung "Speicher" und seine Unterordner auf 777 mit

sudo chmod -R 777 storage/

2) Gehen Sie im Browser zur Laravel-Homepage Laravel / public / (Laravel erstellt die erforderlichen anfänglichen Speicherdateien).

3) Geben Sie die sichere 775-Berechtigung für den Speicher und seine Unterordner zurück

sudo chmod -R 775 storage/

2

Wenn Sie Laradock verwenden, versuchen Sie es chown -R laradock:www-data ./storagein Ihrem Arbeitsbereich-Container


1

In meinem Fall bestand die Lösung darin, die Berechtigung in app/storage/framework/viewsund die app/storage/logsVerzeichnisse zu ändern .


0

Wenn jemand anderes auf ein ähnliches Problem mit dem Fehler "fopen file permissions" stößt, aber klug genug ist, chmod 777 nicht blind zu machen, ist hier mein Vorschlag.

Überprüfen Sie den Befehl, den Sie verwenden, auf Berechtigungen, die Apache benötigt:

fopen('filepath/filename.pdf', 'r');

Das 'r' bedeutet, dass es nur zum Lesen geöffnet ist. Wenn Sie die Datei nicht bearbeiten, sollten Sie sie so einstellen. Dies bedeutet, dass Apache / WWW-Daten mindestens eine Leseberechtigung für diese Datei benötigen. Wenn die Datei über Laravel erstellt wird, verfügt sie bereits über eine Leseberechtigung.

Wenn Sie aus irgendeinem Grund in die Datei schreiben müssen:

fopen('filepath/filename.pdf', 'r+');

Stellen Sie dann sicher, dass Apache auch über Berechtigungen zum Schreiben in die Datei verfügt.

http://php.net/manual/en/function.fopen.php


0

Starten Sie einfach Ihren Server mit artisian

php artisian serve

Greifen Sie dann über die angegebene URL auf Ihr Projekt zu:

Geben Sie hier die Bildbeschreibung ein


0

Ich habe das gleiche Problem, wenn Vagrant auf einem Mac ausgeführt wird. Das Problem wurde behoben, indem der Benutzer des Apache-Servers in der Datei https.conf geändert wurde:

# check user for php
[vagrant] ubuntu ~ $ php -i | grep USER
USER => ubuntu
$_SERVER['USER'] => ubuntu
[vagrant] ubuntu ~ $ 

Führen Sie Apache unter PHP User anstelle von User Daemon aus, um das Dateizugriffsproblem mit PHP zu beheben

# change default apache user from daemon to php user
sudo sed -i 's/User daemon/User ubuntu/g' /opt/lampp/etc/httpd.conf
sudo sed -i 's/Group daemon/Group ubuntu/g' /opt/lampp/etc/httpd.conf

Jetzt kann die von PHP erstellte Cache-Datei von Apache gelesen und bearbeitet werden, ohne dass ein Zugriffsberechtigungsfehler angezeigt wird.


0

Nach vielen Versuchen und Irrtümern mit Verzeichnisberechtigungen kam es zu einer Offenbarung ... auf der Partition der Festplatte war kein Platz mehr vorhanden. Ich wollte nur teilen, um sicherzustellen, dass niemand dumm genug ist, weiter nach der Lösung in die falsche Richtung zu suchen.

Unter Linux können df -hSie die Festplattengröße und den freien Speicherplatz überprüfen.


0

Dieses Problem, das tatsächlich von verschiedenen Benutzern verursacht wird, die write/readDateien ablegen möchten, die jedoch abgelehnt wurden, führt zu unterschiedlichen Eigentumsverhältnissen. Vielleicht haben Sie als "root" Laravel installiert, bevor Sie sich auf Ihrer Site als "Laravel" -Benutzer anmelden, wobei "Laravel" der Standardbesitz ist. Dies ist also das eigentliche Problem hier. Wenn der Benutzer 'laravel' standardmäßig alle Dateien auf der Festplatte lesen / schreiben möchte, um dies zu verweigern, führt dies dazu, dass diese Datei den Besitz von 'root' hat.

Um dieses Problem zu lösen, können Sie wie folgt vorgehen:

sudo chown -hR your-user-name /root /nameforlder

oder in meinem Fall

sudo chown -hR igmcoid /root /sublaravel

Fußnote:

  1. root als Name erster Besitzer, der zuvor installiert hat
  2. your-user-name als Standardbesitz, der tatsächlich in die Site schreibt / liest.
  3. namefolder als Namensordner, in dem Sie den Besitz ändern möchten.

0

Ich habe die gleichen Fehler in meinem Projekt ...
Aber ich habe herausgefunden, dass ich vergessen habe, enctypemein Formular einzutragen.

<form method="#" action="#" enctype="multipart/form-data">

Hoffe es hilft irgendwo irgendwie ...


0

Während der Arbeit unter Windows 10 mit Laragon und Laravel 4 schien es mir nicht möglich zu sein, die Berechtigungen manuell zu ändern, da die Ausführung von chmodBefehlen im eingebauten Laragon-Terminal keine Auswirkungen hatte.

In diesem Terminal war es jedoch möglich, zum Speicherordner zu wechseln und die gewünschten Ordner wie folgt manuell hinzuzufügen:

cd app/storage
mkdir cache
mkdir meta
mkdir views
mkdir sessions

Mit dem cdBefehl-im Terminal gelangen Sie zum Ordner (möglicherweise müssen Sie diesen Pfad an Ihre Dateistruktur anpassen). Mit dem mkdirBefehl-wird das Verzeichnis mit dem angegebenen Namen erstellt.

Ich hatte keine Gelegenheit, diesen Ansatz in Laravel 5 zu testen, aber ich gehe davon aus, dass ein ähnlicher Ansatz funktionieren sollte.

Natürlich könnte es einen besseren Weg geben, aber zumindest war dies eine vernünftige Lösung für meine Situation (Behebung des Fehlers :) file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream.


-1
  1. Löschen Sie zuerst den Speicherordner und erstellen Sie dann erneut den Speicherordner.
  2. Erstellen Sie im Speicherordner einen neuen Ordnernamen als Framework.
  3. Erstellen Sie im Framework-Ordner drei Ordnernamen als Cache, Sitzungen und Ansichten.

Ich habe mein Problem damit gelöst.


-4

Ich habe versucht, den 777Zugriff auf den Speicherordner zu gewähren , und es hat Arbeit für mich

1) Gehen Sie ( /var/www/htmlfür mich) in Ihr Laravel-Stammverzeichnis und führen Sie den folgenden Befehl aus

chmod 777 -R storage

2
Setzen Sie die Berechtigungen nicht auf 777, da dies das Verzeichnis für alle sichtbar und bearbeitbar macht, die das Verzeichnis sehen können. Dies wird nicht empfohlen!
CodeNinja
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.