yakamara / redaxo_yrewrite

A multidomain URL rewrite engine for REDAXO
MIT License
56 stars 35 forks source link

rex_yrewrite::getDomainByName() findet Domain nicht #556

Open iceman-fx opened 11 months ago

iceman-fx commented 11 months ago

getDomainByName() findet die korrekte Domain nicht, wenn ein und dieselbe Domain in verschiedenen Varianten angelegt wurde.

"domain.de" "https://domain.de" "domain.de/" "https://domain.de/" ...

Zusätzlich problematisch ist dabei, dass im Domainobjekt als Name bei allen 3 Varianten immer nur "domain.de" steht.

Man kann daher z.B. hiermit getDomainByName($_SERVER['SERVER_NAME']) nicht auf das korrekte Domainobjekt zugreifen, wenn die Domain mit https oder / angelegt wurde.

Lt. Anleitung ist "https" und "/" optional, was es aber anscheinend doch nicht ist, da alle 3 Varianten unterschiedliche Domains für YRewrite sind. Praktisch sind es aber alle die gleiche Domain, da https und der / nicht zur eigentlichen Domain gehören.

tbaddade commented 11 months ago

Was willst du denn mit dem Anlegen der 4 Varianten erreichen? Der einzige Unterschied ist, wie das im Nachhinein mit dem Protokoll weiter geht.

iceman-fx commented 11 months ago

Genau das ist ja das Problem. Ich kann bis zu 6 Varianten anlegen, obwohl alles das gleiche wäre.

Damit kann man nicht wirklich sicher über den Domainnamen prüfen, da man u.U. nicht weiß, wie die Domain angelegt wurde damit die Prüfung erfolgreich ist.

tbaddade commented 11 months ago

Ich vermute was du suchst, ist das hier

dd(rex_yrewrite::getCurrentDomain());

Falls es das nicht ist, könntest du mehr Kontext liefern? Ich verstehe noch nicht ganz dein Problem. Willst du über SERVER_NAME gehen, dann müsstest du diesen ggf. selbst normalisieren, wobei bei mir hier domain.de, also ohne Scheme drin steht.

iceman-fx commented 11 months ago

rex_yrewrite::getCurrentDomain() ist es nicht. Das liefert nicht die korrekte Domain, da es nur eine Domain aus seiner definierten Liste liefert, aber nicht die tatsächlich aktuell genutzte Domain.

iceman-fx commented 11 months ago

Die aktuelle Domain lese ich mit SERVER_NAME aus. Soweit klar. Jetzt muss/will ich dies aber mit der YRewrite-Domain gegen prüfen, ob diese angelegt wurde.

Dabei kann es schnell passieren, dass die Schreibweise zum gegenprüfen (getDomainByName()) nicht stimmt, da diese Funktion lediglich den in der DB befindlichen (angelegten) Namen zur Prüfung heranzieht. Und wenn da jemand z.B. dies mit https und/oder End-Slash gemacht hat, klappt es nicht.

Lässt man sich zusätzlich noch das YRewrite-Domain-Objekt ausgeben, dann steht da aber immer der reine Domainname drin.

Bsp: Suche nach "domain.de" mit getDomainByName() findet nicht "https://domain.de" oder "domain.de/". Bei allen angelegten Varianten steht aber im Domain-Objekt immer "domain.de" drin. D.h. bis zu 6x mal der gleiche Domainname.

tbaddade commented 11 months ago

Jetzt muss/will ich dies aber mit der YRewrite-Domain gegen prüfen, ob diese angelegt wurde.

if (null === rey_yrewrite::getDomainByName($_SERVER['SERVER_NAME']) {
    // Domain existiert in yrewrite nicht
}
DanielWeitenauer commented 11 months ago

Ist das denn ein praktisches oder ein theoretisches Problem? D.h. wie wahrscheinlich is es, dass jemand auf die Idee kommt, sechs Varianten der gleichen Domain mit unterschiedlichen Attributen anzulegen?

Technisch ist es ja so, dass die Datenbank-Einträge von Yrewrite normalisiert und im Ordner redaxo/cache gespeichert werden. D.h. Slashes werden aus dem Domainnamen entfernt und das Protokoll extrahiert. Von dort werden sie in ein Array mit dem normalisierten Domainnamen als Key eingelesen. D.h., dass Yrewrite immer mit dem letzten Eintrag zur jeweiligen Domain arbeitet, die übrigen werden jeweils vom Folgeeintrag überschrieben.

iceman-fx commented 11 months ago

@DanielWeitenauer Ist ein praktisches Problem, wenn mehrere Personen daran arbeiten und einer nicht aufpasst beim Anlegen.

Ich habe es getestet, da ich aktuell ein Projekt habe, wo ich mit SERVER_NAME gegenprüfen will. Und das klappt nicht, wenn ich die Domain z.B. mit https in YRewrite anlege.

iceman-fx commented 11 months ago

@tbaddade Das klappt eben bei mir nicht, wenn die Domain mit https in YRewrite angelegt wurde. Domain existiert ja, aber eben nicht in SERVER_NAME Schreibweise.

DanielWeitenauer commented 11 months ago

@iceman-fx

Lt. Anleitung ist "https" und "/" optional, was es aber anscheinend doch nicht ist, da alle 3 Varianten unterschiedliche Domains für YRewrite sind. Praktisch sind es aber alle die gleiche Domain, da https und der / nicht zur eigentlichen Domain gehören.

Dies scheint ein Missverständnis zu sein. Du kannst zwar verschiedene Datenbankeinträge mit und ohne https etc. für eine Domain anlegen, jedoch werden sie von Yrewrite intern alle als die gleiche Domain behandelt. Daher ist Yrewrite jeweils nur der letzte Eintrag bekannt.

Hast du mal mit rex_yrewrite::getDomains() geprüft, ob der gesuchte Eintrag Yrewrite überhaupt bekannt ist?

tbaddade commented 11 months ago

Das klappt eben bei mir nicht, wenn die Domain mit https in YRewrite angelegt wurde. Domain existiert ja, aber eben nicht in SERVER_NAME Schreibweise.

Meine Antwort von oben:

Willst du über SERVER_NAME gehen, dann müsstest du diesen ggf. selbst normalisieren

Du musst SERVER_NAME selbst normalisieren, damit der Abgleich mit yrewrite funktioniert. yrewrite speichert den Eintrag immer als domain.de oder www.domain.de ab.

Hast du schon mal $_SERVER['HTTP_HOST'] zum Vergleichen genutzt?