MetaModels / core

MetaModels Core Module
GNU Lesser General Public License v3.0
96 stars 42 forks source link

Filter "Einfache Abfrage" funktioniert nicht bei Hosts mit abweichendem Port #1321

Closed LinkingYou closed 5 years ago

LinkingYou commented 5 years ago

Checklist before I submit this issue report

I confirm that:

My environment is:

(Please fill in the actual values from your environment - check Contao Manager or use composer show)

Key Value Comments
PHP version: 7.3
Contao version: 4.4.40
MetaModels version: 2.1.4
Installed MetaModels packages:
DCG version: 2.1.3

Issue description

Wenn man eine von Port 80 abweichende URL für Contao nutzt und in der Contao-Seitenstruktur bei Domainnamen www.meine-tolle-testdomain.de:12345 einträgt, dann funktioniert z. B. der Filter "Einfache Abfrage" nicht mehr und man erhält kein Detail-Ergebnis.

Der Grund hierfür scheint im core/src/Filter/FilterUrlBuilder.php zu liegen. In der Funktion determineFragments ab Zeile 255 findet man folgenden Abschnitt:

        // Use folder-style URLs
        if (Config::get('folderUrl') && false !== strpos($requestUri, '/')) {
            $fragments = $this->getFolderUrlFragments(
                $requestUri,
                $request->getHost(),
                $request->attributes->get('_locale')
            );
        }

In $request->getHost() steht nur www.meine-tolle-testdomain.de. Der Port ist hier nicht enthalten - man würde diesen ja über $request->getPort() erhalten.

In der aufgerufenen Funktion getFolderUrlFragments im gleichen File wird dann der übergebene Hostnamen verwendet, um aus dem Array $pages eine passende Seite zu finden. Im Key in diesem Array steht aber der komplette Domainname aus der Contao-Seitenstruktur - somit matched das leider nicht mehr und die Seite wird nicht mehr gefunden.

        // Look for a root page whose domain name matches the host name
        if (isset($pages[$host])) {
            $languages = $pages[$host];
        } else {
            // empty domain
            $languages = $pages['*'] ?: [];
        }
        unset($pages);

Evtl. wäre es eine Lösung, statt $request->getHost() besser $request->server->get('HTTP_HOST') zu verwenden.

In unseren Tests hat das zumindest gut funktioniert.

Die Funktion im ganzen sähe dann so aus:

private function determineFragments(Request $request): ?array
    {
        if (null === $requestUri = $this->strippedUri($request)) {
            return null;
        }

        $fragments = null;
        // Use folder-style URLs
        if (Config::get('folderUrl') && false !== strpos($requestUri, '/')) {
            $fragments = $this->getFolderUrlFragments(
                $requestUri,
                $request->server->get('HTTP_HOST'),
                $request->attributes->get('_locale')
            );
        }

        // If folderUrl is deactivated or did not find a matching page
        if (null === $fragments) {
            if ('/' === $requestUri) {
                return null;
            }
            $fragments = explode('/', $requestUri);
        }

        // Add the second fragment as auto_item if the number of fragments is even
        if (Config::get('useAutoItem') && 0 === (\count($fragments) % 2)) {
            array_insert($fragments, 1, ['auto_item']);
        }

        $fragments = $this->getPageIdFromUrlHook($fragments);

        // Return if the alias is empty (see #4702 and #4972)
        if (null === $fragments || ('' === $fragments[0] && \count($fragments) > 1)) {
            return null;
        }

        return $fragments;
    }

Screenshots

image

discordier commented 5 years ago

Nur um sicher zu gehen, ihr habt in der Seitenstruktur also bei Domain www.meine-tolle-testdomain.de:12345 drin stehen?

LinkingYou commented 5 years ago

Nur um sicher zu gehen, ihr habt in der Seitenstruktur also bei Domain www.meine-tolle-testdomain.de:12345 drin stehen?

Ja. Wenn wir den Port nicht mit eintragen, dann redirected Contao auf die Domain ohne Portangabe.

discordier commented 5 years ago

.... ich habe Contao selbst noch nie auf non standard Ports betrieben, wusste auch nicht dass dies einfach so geht (potentielle side effects mit proxies).

Anyway, der korrekte patch sollte IMO sein:

diff --git a/src/Filter/FilterUrlBuilder.php b/src/Filter/FilterUrlBuilder.php
--- a/src/Filter/FilterUrlBuilder.php
+++ b/src/Filter/FilterUrlBuilder.php
@@ -264,5 +264,5 @@
             $fragments = $this->getFolderUrlFragments(
                 $requestUri,
-                $request->getHost(),
+                $request->getHttpHost(),
                 $request->attributes->get('_locale')
             );
LinkingYou commented 5 years ago

Danke! Perfekt. Der Patch funktioniert.

MiniModel commented 5 years ago

This issue has been labeled with testing but got no feedback.

We are reliant on feedback to prove a ticket fixed as we can not tell if the ticket has been resolved if we receive no feedback. I will close this ticket now, as I assume it has been resolved. If the ticket should still be valid, please feel free to reopen it.

@LinkingYou could you please have a final look at this and tell if your issue has been resolved?

LinkingYou commented 5 years ago

@MiniModel As I already wrote, the patch works fine. Thank you for the quick deployment.

zonky2 commented 5 years ago

@LinkingYou

Thank you for the quick deployment.

https://now.metamodel.me/de/unterstuetzer/spenden