YOURLS – Your Own URL Shortener – stellt eine Reihe von PHP-Skripten zur Verfügung, um seinen eigenen URL-Shortener zu betreiben, inklusive API, Statistiken, Plugins und mehr.
Ausgangspunkt ist ein Server, auf dem bereits MySQL und PHP eingerichtet ist, wobei für das YOURLS-API ist zudem das curl-Modul für PHP nötig.
Mein Ziel war es, YOURLS mit nginx in einem Unterverzeichnis zum Laufen zu bekommen wie domain.tld/short. Im Folgenden ist mein Weg dokumentiert, wie ich dies geschafft habe.
Für die Installation habe ich es mir einfach gemacht und YOURLS via yaourt installiert:
$ yaourt -S yourls
Als nächstes erstellen wir die Datenbank, in der die nötigen Daten hinterlegt werden:
$ mysql -u root -p > CREATE DATABASE yourls; > GRANT ALL PRIVILEGES ON yourls.* TO 'yourls'@'localhost' IDENTIFIED BY 'superSECRETpassword'; > FLUSH PRIVILEGES; > exit
Nun können wir uns um die Einstellungen für den Dienst kümmern. Dazu ändern wir die von YOURLS unter /etc hinterlegte config.php ab
# vim /etc/webapps/yourls/config.php
Dabei passen wir die MySQL-Einstellungen entsprechend den zuvor gesetzten Werten an. YOURLS_SITE ist im Falle des eingangs erwähnten Unterordners domain.tld/short.
Ein Passwort für YOURLS_COOKIEKEY kann hier generiert werden.
Allgemeine Infos zur Konfiguration können hier gefunden werden.
Die von uns modifizierte config.php verlinken wir nun nach /usr/share/webapps und passen die Berechtigungen an:
# cd /usr/share/webapps/yourls # chown -R root:http . # ln -s /etc/webapps/yourls/config.php config.php # chown root:http /etc/webapps/yourls/config.php # chmod 664 /etc/webapps/yourls/config.php
Dabei dient der letzte Befehl dem Umstand, dass YOURLS die Klartext-Passwörter mit phpass hashen kann (Schreibrechte dazu nötig, kann später geändert werden Infos).
In Version 1.7.2 und früher existiert ein Bug, welcher wohl erst mit Release 2.0 gefixt wird: Die Tabelle _url benutzt natürliche Schlüssel als PRIMARY KEY, keine auto-increment keys. Die maximale Länge für InnoDB beträgt 767 Byte. YOURLS verwendet varchar(200) als key, was 800 Byte entspricht. Dadurch schlägt die Erstellung der Tabelle fehl. Abändern auf varchar(191) behebt das Problem: 191 chars * 4 bytes/char = 764 < 767. Infos dazu finden sich hier.
# vim includes/functions-install.php
Hier die Methode function yourls_create_sql_tables() { suchen, dort in dem Befehl $create_tables[YOURLS_DB_TABLE_URL] = die Zeile
'`keyword` varchar(200) BINARY NOT NULL,'.
zu
'`keyword` varchar(191) BINARY NOT NULL,'.
abändern.
Jetzt sollte nach dem Aufruf von /admin beim Installieren kein Problem auftreten.
Als nächstes bereiten wir nginx vor. Die im YOURLS-Wiki angegebene Konfiguration funktioniert nur, wenn YOURLS im webroot betrieben wird, aber nicht in einem Unterordner. Dafür ist eine abgeänderte Konfiguration nötig.
# vim /etc/nginx/nginx.conf
Dort fügen wir zuerst in den http{} Block zwei Mappings ein, die hier beschrieben sind:
# Gets the basename of the original request
map $request_uri $request_basename {
~/(?<captured_request_basename>[^/?]*)(?:\?|$) $captured_request_basename;
}
# Gets the basename of the current uri
map $uri $basename {
~/(?<captured_basename>[^/]*)$ $captured_basename;
}
In den server{} Block für die Domain, mit der es verwendet werden soll, wird folgendes eingefügt. Hier wird /short im Webroot der Domain verwendet:
## YOURLS URL shortener
location /short {
access_log /var/log/nginx/yourls-access.log;
error_log /var/log/nginx/yourls-error.log warn;
# Try files, then folders, then yourls-loader.php
# --- The most important line ---
try_files $uri $uri/ /short/yourls-loader.php?$request_basename;
# PHP engine
location ~ \.php$ {
#fastcgi_split_path_info ^(.+\.php)(/.+)$;
try_files $uri = 404;
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Die Einstellungen können mit nginx -t überprüft werden, bevor mit systemctl restart nginx der Webserver neugestartet wird.
Als letzten Schritt verknüpfen wir die unter /usr/share/webapps installierten Daten mit dem Unterordner in unserem Webroot, von dem aus der URL Shortener ausgeliefert werden soll:
# ln -s /usr/share/webapps/yourls /path/to/webroot/short
Letztlich wird über den Aufruf von domain.tld/short/admin die Installation ausgeführt und wir können uns einloggen, um URLs zu kürzen.
Eine andere Möglichkeit zum Kürzen von URLs besteht darin, domain.tld/short/ vor der zu kürzenden Domain einzufügen.
Oder: Unter dem Punkt Tools die jeweiligen Shortcuts als Bookmark speichern (javascript Funktionen), um per Klick darauf die offene URL zu kürzen. Dazu muss man eingeloggt sein.
Allgemeine Infos zur Konfiguration, Plugins und mehr können im Wiki von YOURLS gefunden werden.
Bisher habe ich durch die oben beschriebene Methode einen Nachteil gefunden. Durch regex von nginx macht die Tilde Probleme, beispielsweise bei Verwendung von Plugins wie preview-url, anhängen von ~ funktioniert nicht.
Ein Workaround: Statt Tilde ein anderes Zeichen verwenden, wie beispielsweise |.