Closed xwolfde closed 3 months ago
Die Korrektheit einer neuen Umsetzung in PHP oder JS kann über die folgende URL gegengeprüft werden: http://go.fau.de/shorturl.shtml
Perl-Code und "Services (ALT)" ist jetzt hier in PHP 8.2 umgesetzt:
https://github.com/RRZE-Webteam/rrze-shorturl/commit/f710e262c9ba9fba78cd973fef11bf97e572bbef
@xwolfde
Berechnung bekannter URLs ist klar und umgesetzt. Aber wie ist ein URL unserer Domains zu berechnen?
ID vom Dienst sei 1
Kannst du mir das bitte an diesem Bsp sagen?
wird zu https://go.fau.de/1... ?
Siehe oben unter Blogdienst. Wir müssten also
ABER: Es stellt sich die Frage, ob das so sinnvoll ist. Aufgrund der Länge der beiden IDs plus der führenden Ziffer für die CMS Instanz wird die ShortURL länger als wenn wir eine normale URL speichern und eine ID vergeben. Wir müssten ausserdem je CMS-Cluster (wir haben ja jetzt schon ) unterschiedliche Dienstids haben. Von daher würde ich dazu tendieren, das vielleicht doch nicht so zu machen.
Von daher denke ich, dass es sinnvoller ist, die ZIeladresse normal zu speichern und mit Fall 1 (siehe oben, also eine normale URL ohne Dienstzuweisung) vorzugehen.
Dann hätten wir nur den Zustand vom alten System, oder? D.h. Kunden-URLs werden gar nicht geshortet.
Aber wir könnten unseren Kunden shorten anbieten. Z.B.:
Bei den Bekannten Diensten ist die Berechnung mit Service-ID, etc logisch. Aber bei unbekannten URLs reicht es doch, dass die unique geshortet werden.
Das obige Verfahren liefert kürze ShortURLs als MD5 und co. Deswegen wurde es entwickelt und nicht einfach das bekannte verwendet. Ziel der ShortURLs muss auch sein, dass man die als Dozent an eine Tafel schreiben kann. Oder sich sogar merken kann!
1hg ist leichter merkbar als 8kdhgslkdhgl343hkrz689
Aus https://www.fau.de/research/service-fuer-forschende/foerderung-beratung-und-antragsstellung/foerderberatung-und-antragskonzeption/ kann nicht der URL in Form von https://www.fau.de/?p=123 ermittelt werden, um nach dem Verfahren zu shorten.
Wie kann "research/service-fuer-forschende/foerderung-beratung-und-antragsstellung/foerderberatung-und-antragskonzeption/" mit dem Verfahren kodiert werden?
Speicherung und Generierung:
Bei der Rückwärtsauflösung:
perfekt. danke
Die Links von unseren Blogs sind nicht in Form von $Uniportal::ShortURL::Services
Erwartet wird http://blogs.fau.de/go/$p1/$p2 Gegeben ist aber zB https://blogs.fau.de/rewi/2024/02/15/erfolgreiches-pilotprojekt-e-klausuren-in-der-uebung-fuer-fortgeschrittene-im-zivilrecht/
Damit funktioniert http://go.fau.de/shorturl.shtml nicht.
(wp_make_link_relative() zu nutzen um andere Formate der URL zu bekommen, funktioniert nur innerhalb der gleichen Website.)
Im Perl-Code wird nur die Blog-ID, aber nicht auch die Artikel-ID verwendet.
Die Eingabe-URL https://blogs.fau.de/go/179/142996 wird an die Funktion getIdResourceByServiceURL übergeben. Die Funktion durchläuft die im $Uniportal::ShortURL::Services definierten Muster, um eine Übereinstimmung zu finden. Es gleicht die URL mit dem Muster für den Dienst „Blog“ ab, extrahiert die ID 179 und gibt sie zusammen mit dem Diensttyp zurück. Die extrahierte ID 179 wird dann verwendet, um die Ziel-URL für den Dienst „Blog“ zu erstellen, wobei 142996 nicht direkt beteiligt ist. Abschließend wird die Kurz-URL basierend auf der extrahierten ID und dem Diensttyp generiert.
done in 0.1.3
Bitte um korrekte Umrechnungsformel von Short-URL zu Long-URL.
Grund: Die Berechnung in Perl ist falsch.
Eingabe: http://go.fau.de/9wa22 Ausgabe: https://www.helpdesk.rrze.fau.de/otrs/index.pl?Action=AgentTicketZoom;TicketID=wa22 Soll: https://www.helpdesk.rrze.fau.de/otrs/index.pl?Action=AgentTicketZoom;TicketID=1167490
#!/usr/bin/perl
use strict;
use warnings;
package ShortURLConverter;
# Konstruktor-Methode
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
# Methode zur Konvertierung der Kurz-URL in die Ziel-URL
sub convertShortURLToTargetURL {
my ($self, $shortURL) = @_;
my ($prefix, $code) = $self->getIdResourceByShortURL($shortURL);
return $self->createTargetURL($prefix, $code);
}
# Methode zur Extrahierung der Präfix- und Codeinformationen aus der Kurz-URL
sub getIdResourceByShortURL {
my ($self, $url) = @_;
my ($prefix, $code) = $url =~ m|/([0-9])([a-z0-9\-]+)$|i;
die "Ungültiges Kurz-URL-Format\n" unless $prefix && $code;
return ($prefix, $code);
}
# Methode zur Erstellung der Ziel-URL basierend auf dem Präfix und dem Code
sub createTargetURL {
my ($self, $prefix, $code) = @_;
my $targetURL = $self->_getTargetURLByPrefix($prefix);
die "Target-URL nicht gefunden für den angegebenen Präfix\n" unless $targetURL;
$targetURL =~ s/\$id/$code/g;
return $targetURL;
}
# Methode zur Abrufung der Ziel-URL anhand des Präfixes (interne Methode)
sub _getTargetURLByPrefix {
my ($self, $prefix) = @_;
my %services = (
'9' => 'https://www.helpdesk.rrze.fau.de/otrs/index.pl?Action=AgentTicketZoom;TicketID=$id',
# Hier weitere Dienste hinzufügen...
);
return $services{$prefix};
}
# Ende der ShortURLConverter-Klasse
# Beispielverwendung
my $converter = ShortURLConverter->new();
my $targetURL = $converter->convertShortURLToTargetURL("http://go.fau.de/9wa22");
print $targetURL;
Das gleiche Problem taucht natürlich in der Umsetzung in PHP 8.2 ebenso auf:
<?php
class ShortURLConverter {
private const ShortURLBase = "http://go.fau.de/";
private const ShortURLModChars = "abcdefghijklmnopqrstuvwxyz0123456789-";
private $services = [
'helpdesk' => [
'prefix' => 9,
'targeturl' => 'https://www.helpdesk.rrze.fau.de/otrs/index.pl?Action=AgentTicketZoom;TicketID=$id'
]
];
public function convertShortURLToTargetURL($shortURL) {
try {
$prefix = substr($shortURL, strlen(self::ShortURLBase), 1);
$code = $this->getIdResourceByShortURL($shortURL);
$targetURL = $this->getTargetURLByPrefix($prefix, $code);
return $targetURL;
} catch (Exception $e) {
return $e->getMessage();
}
}
private function getIdResourceByShortURL($url) {
preg_match('/\/([a-z0-9\-]+)$/i', $url, $matches);
if (!$matches || count($matches) < 2) {
throw new Exception('Invalid Short URL format');
}
return $matches[1];
}
private function getTargetURLByPrefix($prefix, $code) {
foreach ($this->services as $service) {
if ($service['prefix'] == $prefix) {
return str_replace('$id', $code, $service['targeturl']);
}
}
throw new Exception('Target URL not found for given prefix');
}
}
// Beispielverwendung
$converter = new ShortURLConverter();
$targetURL = $converter->convertShortURLToTargetURL("http://go.fau.de/9wa22");
echo $targetURL;
?>
Oder sag mir bitte, wie ich auf /proj/websource/docs/redirects/www.rrze.fau.info/cgi-bin/lib/Uniportal/ShortURL.pm zugreifen kann, falls das das File ist, das aktuell beim Helpdesk im Einsatz ist.
Hab dir die Files geschickt. WIe anderswo geschrieben ist der Service des Blogdienst nicht mehr relevant und funktioniert daher nicht.
Für OTRS/Helpdesk funktioniert die Umleitung unter obiger URL http://go.fau.de/shorturl.shtml
Aktuell erfolgt die Umleitung lt. .htaccess auf go.fau.de so:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(x0+[0-9A-Za-z\-\.]+)/?$ fau-redirect.php?code=$1 [L]
RewriteRule ^([0-9]+[0-9A-Za-z\-\.]+)/?$ cgi-bin/uniportal/redirect.pl?code=$1 [L,QSA]
Die bisherige Berechnung von ShortURLs erfolgt auf Basis einer Transformation von numerischen Ids auf der Basis 10 (z.b. die Nummer eines OTRS-Tickets) auf Zahlenbasis 37 (!) auf Basis der Zecihenkette
abcdefghijklmnopqrstuvwxyz0123456789-
. Durch diese mathematische Transformation, die umkehrbar und eindeutig ist, werden auch große Zahlen in sehr kurze Strings umgewandelt.Die ShortURL besteht aus zwei Bestandteilen: Der Adresse
https://go.fau.de/
und dem dem Zeichencode. Der Zeichencode identifiziert eindeutig eine Identifikationsnummer und den dazugehörigen Dienst.Das erste Zeichen des Zeichencodes identifiziert dabei den zugehörigen Dienst.
Alle folgenden Zeichen sind eine Umrechnung einer oder mehrerer Identifikationsnummern.
Wenn das erste Zeichen keine gültige ID für einen bekannten Service ist (aktuell aktiv nur die "9"), sollen stattdessen zwei Fälle behandelt werden:
semesterbeginn
. Mehr als zwei Worte wären auch denkbar, diese werden jedoch in der URI mit einem + getrennt. Die Ziel-Adresse wird dann in der Datenbank gesucht.Umrechnung von numerischen Ids einer bekannten URL in eine ShortURL-Zeichenkette
Zur Umrechnung einer Identifikationsnummer in den Zeichenstring wird die Nummer zunächst auf die Zahlenbasis 37 umgerechnet. Danach wird jeder Ziffer auf Basis 37 ein Zeichen der Menge
abcdefghijklmnopqrstuvwxyz0123456789-
zugewiesen. Das Zeichen-
nimmt dabei die Rolle des Offsetzeichens an.Beispiele
Die ShortURL
http://go.fau.de/1a
wird also umgerechnet stehen für die Adresse des Services mit der Identifikationsnummer 1 und darauf folgend der Id mit dem Wert 1 (a=1).Buchstaben innerhalb des Zeichenstrings können auch in Goßschrift angegeben werden, sind also Case Insensitiv. Dies ist bewusst gemacht wurden, damit es bei dem Lesen der Shorturls durch einen Menschen weniger Missverständnisse gibt.
Beispiele zur Berechnung auf Basis von bekannten Services, die auf eine numerische Id in der Zieladresse basieren
Wenn ein Ziel für die Erstellung der berechneten URL mehr als eine Id als Parameter benötigt, werden diese Ids bei der ShortURL durch Punkte getrennt.
OTRS (Nur ein Parameter)
9
.https://www.helpdesk.rrze.fau.de/otrs/index.pl?Action=AgentZoom&TicketID=$id
Ich hab die lange URL zu einem Ticket mit der TicketID 1167490. Die Target-URL wäre also:
https://www.helpdesk.rrze.fau.de/otrs/index.pl?Action=AgentTicketZoom;TicketID=1167490
Die ShortURL würde also mit 9 beginnen und danach die Ziffer 1167490 umrechnen. Nach der o.g. Berechnung wäre dies dann:
http://go.fau.de/9wa22
Blogdienst (Zwei Parameter in der URL) (derzeit nicht funktionabel, da auf dem Blogdienst die Umleitung auf Instanzen nicht mehr aktiv ist)
7
.http://blogs.fau.de/go/$p1/$p2
Das Webworking-Blog auf dem Blogdienst hat die Instanz-Id 179. Ein Beitrag hat die Post-Id: 142996. Die Target-URL wäre also
https://blogs.fau.de/go/179/142996
. (Das ganze würde dann aufhttps://blogs.fau.de/webworking/?p=142996
umleiten.)Der ShortURL wird also mit 7 beginnen und die beiden Zahlen durch die Teile
179.142996
berechnen, wobei der Punkt das Trennzeichen ist. Somit sähe in dem Fall die ShortURL so aus:https://go.fau.de/7d4.b3p1
Aktuell wird nur noch der OTRS-Service aktiv genutzt.
Services (ALT)
Folgenden Services waren in der bisherigen Umsetzung definiert. Die Services faq und wke können jedoch ersatzlos entfallen.
Berechnung (Perl)
Bisher wurde die Berechnung mit folgender Perl-Funktion geleistet:
Quelldatei: /proj/websource/docs/redirects/www.rrze.fau.info/cgi-bin/lib/Uniportal/ShortURL.pm