RSS Feed  •  Profil  •  Private Nachrichten  •  Registrieren  •  Login 
  
 
im Forum




Blog-Übersicht -> Nginx: Slash an Ordner anhängen - relative Weiterleitung Ich fliege zum Mars! Schon wieder... :: Router in a Box
Nginx: Slash an Ordner anhängen - relative Weiterleitung
Verfasst am: 29.08.2015, 18:59   Autor: killerbees19
Kürzlich hatte ich das Problem, dass proxy_redirect bei einem Nginx-Webserver nicht wie gewünscht funktionierte. Wurde ein Ordner ohne abschließendem Slash aufgerufen (/example) fand naturgemäß eine Weiterleitung zur korrigierten Version (/example/) statt. Das Problem dabei war, dass beim Client der interne Pfad vom Proxy ankam, also z.B. /app/701/ anstatt dem öffentlichen /example/ Pfad. Die eigentliche Ursache dafür habe ich noch nicht gefunden, aber vorläufig zwei Workarounds, die beide recht gut funktionieren. Das ist zwar nur eine unschöne Lösung, aber immer noch besser als falsche Pfade. Die gezeigten Konfigurationen müssen leider direkt bei der Website hinterlegt werden, die durch den Proxy abgerufen wird, sind somit also kein direkter Ersatz am öffentlichen Server.

  1. Mit der ersten Methode werden die Zugriffe auf Ordner ohne abschließendem Slash einfach gesperrt und es erfolgt keine Weiterleitung:

    Code:
    location ~ [^/]+$
    {
        if ( -d "$document_root$uri/" )
        {
            return 404;
        }
    }


    Zur Erklärung: Die Location passt auf alles, was kein Slash am Ende hat, somit auch auf jede existierende Datei! Man könnte das noch verfeinern, indem man Punkte im Pfad ausschließt, aber das wollte ich hierbei vermeiden. Eventuelle PHP-Handler oder andere Locations müssen explizit darüber definiert werden. Dieser Eintrag muss der letzte sein!

  2. Die andere Möglichkeit baut das Weiterleitungsverhalten von Nginx nach, verwendet dabei aber keine vollständigen Pfadangaben:

    Code:
    map $request_uri $request_basename
    {
        ~/(?<captured_request_basename>[^/?]*)(?:\?|$) $captured_request_basename;
    }

    map $uri $basename
    {
        ~/(?<captured_basename>[^/]*)$ $captured_basename;
    }

    location ~ [^/]+$
    {
        if ( -d "$document_root$uri/" )
        {
            return 302 "./$basename/";
        }
    }


    Zur Erklärung: Fast wie im ersten Beispiel, wird hier zuerst der eigentliche Dateiname extrahiert und in einer Variable gespeichert. Der map-Teil gehört direkt in den http-Kontext und darf nicht innerhalb eines Location oder Server-Blocks vorkommen! Die Credits für den map-Teil gehen zu 100% an kolbyjack auf Serverfault.


Ich möchte nochmals betonen, dass die gezeigten Snippets extrem unschön und nicht zu empfehlen sind. Aber manchmal gibt es leider keinen anderen Workaround und da ist man froh darüber, wenn man solche Lösungen findet... Smile



Autor Nachricht
Für diesen Beitrag können zur Zeit keine neuen Kommentare verfasst werden.

Kontaktiere den Autor des Beitrages, falls du Fragen dazu hast.


 

Alle Zeiten sind GMT + 1 Stunde
Aktuelles Datum und Uhrzeit: 12.12.2018, 13:48
Nach oben
Valid HTML 4.01 Transitional
Valid CSS!

netcup - Internetdienstleistungen
 
 
[ happytec.at | forum.happytec.at | blog.happytec.at | esports.happytec.at | event.happytec.at ]