Ankündigung

Einklappen
Keine Ankündigung bisher.

URL Gestalten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • URL Gestalten

    Hallo zusammen,
    ich habe mal eine Frage bezüglich der URL Gestaltung.

    Gegeben sei folgende URL: www.example.com/test.php
    Der Benutzer gibt ein: www.example.com/test.php/abc und die Seite wird trotzdem ohne Stylesheet angezeigt. Was muss ich einstellen, damit es zu einer 404 wird?

    Da ich vor habe die URL für eine Breadcrumb-Navigation auszulesen sollte das auf jeden Fall behoben werden.

    Mit mod_rewrite ist es möglich das .php wegzulassen und anschließend hinzuzufügen?
    Es wäre gut, wenn am Ende die URL so aussehen würde:
    www.example.com/test und auf www.example.com/test.php zeigt. Die Eingabe von www.example.com/test/abc soll zu einer 404-Anzeige führen bzw. auf www.example.com/test weiterleiten.


    Wenn dies umgesetzt sein sollte, gibt es dann noch irgendwelche Bedenken, wenn ich die URL auslese und dem Benutzer als Breadcrumb-Navigation anzeige (xss oder so)?
    Wird dies auch von "Profis" so umgesetzt?

    Danke schonmal für eure Antworten und Tipps zu dem Thema.


  • #2
    "Profis" nutzen nur EINEN entry point (index.php) und dort ist ein Router konfiguriert, in der .htaccess datei wird jeder request auf index.php umgeleitet. es gibt nach außen nichts außer der index.php
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

    Kommentar


    • #3
      Der Benutzer gibt ein: www.example.com/test.php/abc und die Seite wird trotzdem ohne Stylesheet angezeigt. Was muss ich einstellen, damit es zu einer 404 wird?
      - http://httpd.apache.org/docs/2.2/mod...acceptpathinfo

      Mit mod_rewrite ist es möglich das .php wegzulassen und anschließend hinzuzufügen?
      Es wäre gut, wenn am Ende die URL so aussehen würde:
      www.example.com/test und auf www.example.com/test.php zeigt. Die Eingabe von www.example.com/test/abc soll zu einer 404-Anzeige führen bzw. auf www.example.com/test weiterleiten.
      Ist prinzipiell alles möglich, geht aber viel einfacher.

      Wenn dies umgesetzt sein sollte, gibt es dann noch irgendwelche Bedenken, wenn ich die URL auslese und dem Benutzer als Breadcrumb-Navigation anzeige (xss oder so)?
      Kontextwechsel musst du so oder so immer passend behandeln.

      - http://wiki.selfhtml.org/wiki/PHP/An...Kontextwechsel

      Wird dies auch von "Profis" so umgesetzt?
      Eher nicht.

      Leite einfach alles an eine index.php-Seite weiter und entscheide dort anhand von $_SERVER['REQUEST_URI'], was nachgefragt ist. Das ist bedeutend einfacher.

      Für Apache zum Beispiel so:

      Code:
          RewriteEngine On
          #RewriteBase /path/to/app
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteRule ^ index.php [QSA,L]
      Oder ab Apache 2.2.16:

      Code:
      FallbackResource /index.php
      - http://silex.sensiolabs.org/doc/web_servers.html

      So was wie Silex kannst du dir insgesamt mal ansehen. Das ist recht überschaubar, zeigt aber, wie Routing und dergleichen heutzutage nahezu in jedem Framework funktioniert.

      Kommentar


      • #4
        Das heißt ich leite grundsätzlich alle Seiten auf index.php weiter und verarbeite dann die URL.
        Und wie zeige ich dann die angefragten .php Dateien an? Ich befinde mich ja dann auf der index.php. Soll dann mit header eine Weiterleitung erfolgen? Das wäre ja zu umständlich, oder? Oder kann ich die angefragten Dateien irgendwie anders ausgeben?

        Kommentar


        • #5
          Das heißt ich leite grundsätzlich alle Seiten auf index.php weiter und verarbeite dann die URL.
          Ja. Beziehungsweise macht man es etwa genauer in der Regel so, dass man den Webserver anleitet, alles auszuliefern, für das eine 1:1-Entsprechung von URL-Pfad und Server-Pfad existiert. (Edit: Das ist bei Serversoftware oft das Standardverhalten.) Alle übrigen URL-Pfade soll der Webserver an die index.php weiterleiten, die eine passende Rückgabe generiert.

          Für statische Daten (vor allem Grafiken, CSS, JavaScript) nutzt man die „URL-Pfad entspricht Server-Pfad“-Regel und lässt die vom Webserver direkt ausliefern.

          Für URL-Pfade, die unmittelbar zur Anwendung gehören, weil dort dynamisch Inhalte erzeugt werden, nutzt man die andere Regel, die alles an die index.php weiterleitet. Dort wird dann selbst nicht mehr an andere eigenständige Scripts per header() weitergeleitet, sondern die benötigte Funktionalität, um einen bestimmten HTTP-Request passend abzuhandeln, wird sozusagen eher inkludiert.

          Dazu existiert eine Routing-Komponente, die für URL-Pfade (oder URL-Pfad-Muster mit Wildcards) den passenden Code auswählt und (zumindest bei größeren Anwendungen) einbindet, der dann die Rückgabe generiert. Das kann man in Silex ganz schön sehen.

          - http://silex.sensiolabs.org/doc/usage.html#routing

          Kommentar


          • #6
            Also wenn ich mod_rewrite so konfiguriere, dass immer ein .php angehangen wird, und der Benutzer ruft die Seite www.example.com/test auf gelangt er auf www.example.com/test.php. In diesem Fall leite ich nicht weiter, da die Seite existiert. Wenn der Benutzer allerdings www.example.com/test/?show=hallo ( ist dies überhaupt möglich? ) aufruft und www.example.com/test/?show=hallo.php nicht gefunden wird, leite ich an die index.php weiter? Habe ich das Prinzip jetzt richtig verstanden?

            Wie bereits oben erwähnt war ich mir bei www.example.com/test/?show=hallo nicht sicher ob das funktioniert. Wenn es funktioniert, kann ich doch theoretisch in mod_rewrite auch einstellen, dass vor dem ? der / durch .php ersetzt wird? Sollte die Datei dann nicht gefunden werden geb ich den 404-Statuscode zurück. Oder ist das wirklich zu umständlich und sollte man auf keinen Fall machen? Irgendwie muss ich die Parameter ja auslesen können wenn die URL z.B. so aussieht:
            www.example.com/test/show1/order3 und die letzten beiden sollen GET-Parameter sein, woher weiß man sowas? Das könnten ja auch Verzeichnisse sein.

            Danke

            Kommentar


            • #7
              Zitat von Max444 Beitrag anzeigen
              Also wenn ich mod_rewrite so konfiguriere, dass immer ein .php angehangen wird, und der Benutzer ruft die Seite www.example.com/test auf gelangt er auf www.example.com/test.php. In diesem Fall leite ich nicht weiter, da die Seite existiert.
              nein du sagst einfach, egal was ankommt wird nur auf index.php weitergeleitet.

              ruft also der user www.example.com/test auf, so wird tatsächlich example.com/index.php/test aufgerufen.

              rufst du example.com/test/?show=hallo auf, wird example.com/index.php/test/?show=hallo aufgerufen.

              in der index.php kannst du dann $_SERVER['REQUEST_URI'] auslesen. anhand diesen informationen, kannst du eine datei includen/instanz erstellen what ever. und beim includen der datei kannst du nachsehen ob datei exestiert oder nicht.

              wobie ?show=hallo eigentlich kein sinn mehr machen würde an der stelle, stattdessen einfach

              example.com/test/hallo
              apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

              Kommentar


              • #8
                wobie ?show=hallo eigentlich kein sinn mehr machen würde an der stelle, stattdessen einfach

                example.com/test/hallo
                Das habe ich ja vorhin schon erwähnt, woher soll ich dann wissen was Verzeichnis und was Parameter ist?

                Könnt ihr mir nochmal schnell erklären wo der Vorteil bei diesem Verfahren ist? Überall .php anhängen bzw. vor die Parameter .php anhängen und bei Fehler ne Fehlermeldung anzeigen wäre doch auch möglich? So einen Router einzubinden / zu programmieren stellt ja auch Aufwand dar.

                Kommentar


                • #9
                  Zitat von Max444 Beitrag anzeigen
                  Das habe ich ja vorhin schon erwähnt, woher soll ich dann wissen was Verzeichnis und was Parameter ist?
                  es gibt einfach ab dann keine $_GET parameter mehr, in $_GET steht quasi nur noch der Pfad und in $_POST stehen daten drin. Man muss eben komplett anders denken und nicht mehr $_GET benutzen.

                  bzw man definiert eben routen mit platzhalter. also

                  /account/create
                  /account/edit/<id>
                  /account/view/<id>

                  Zitat von Max444 Beitrag anzeigen
                  Könnt ihr mir nochmal schnell erklären wo der Vorteil bei diesem Verfahren ist? Überall .php anhängen bzw. vor die Parameter .php anhängen und bei Fehler ne Fehlermeldung anzeigen wäre doch auch möglich?

                  vorteile:
                  1) du hast im document root nur eine index.php rumliegen, alle anderen dateien liegen außerhalb des dokument roots, wenn irgendwas schief läuft mit deinem server und dann plötzlich php dateien nicht mehr interpretiert werden, sieht man eben nur index.php und nicht die sensiblen sachen
                  2) du hast die komplette konfiguration in PHP, so kann deine Anwendung sowohl unter nginx als auch apache funktionieren. es ist wezentlich einfacher im server alles auf index.php umzuleiten als jede routen einstellung in unterschiedlichen servern zu machen
                  3) du hast gut liesbare URLs ohne diese komischen parametern. man kann schon anhand der URL erkennen wohin ich lande. gut für suchmachinen und menschen
                  4) wenn der router schlau ist, und eben ein pfad zur einer funktion mappt, kann später auch Anwendung leicher refaktorisieren und dabei die alte URL noch drin lassen.
                  5) du kannst wesentlich bequemer routen an eine user rolle binden, sprich du hast dann einmal nur deine ausgabe der seite und davor schaltestdu die überprüfung ob man eingeloggt ist ein. und kannst die auch bei bedarf ausschalten, an deiner konkreten ausgaben verändert sich nichts

                  ich denke den anderen hier würden noch mehr vorteile einfallen, ich bin eben nur ein Anfänger

                  Zitat von Max444 Beitrag anzeigen
                  So einen Router einzubinden / zu programmieren stellt ja auch Aufwand dar.
                  wozu sollte man das machen wenn es einen fertigen bereits gibt?

                  http://silex.sensiolabs.org/download hier silex slim downloaden und da in web/index.php reinschauen und weitere routen hinzufügen.

                  http://silex.sensiolabs.org/doc/usag...ynamic-routing da sieht man sehr schön

                  '/blog/{id}' wurde auf eine funktion gemappt
                  PHP-Code:
                   if (!isset($blogPosts[$id])) {
                          
                  $app->abort(404"Post $id does not exist.");
                      } 
                  exestiert der blog eintrag nicht, dann sende einen 404 header response mit $app->abord
                  apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

                  Kommentar

                  Lädt...
                  X