2008-12-28 8 views
19

Ich komme aus einem Java-Hintergrund und mit jeder Servlets-basierten Technologie ist es trivial, eine Reihe von URLs (zB/reports/,/secure/ .do) einem bestimmten Servlet zuzuordnen. Jetzt bin ich mit PHP weniger vertraut, aber ich habe noch nichts gesehen, was mit PHP (oder mod_php) ganz ähnlich ist. Es ist durchaus möglich, dass mir etwas Einfaches fehlt.URL-Zuordnung in PHP?

Wie machen Sie das in PHP?

Einer der Gründe, warum ich dies tun möchte, ist "One Use" URLs. Dies kann nun mit GET-Parametern geschehen (wie ein MD5-Hash-Token), aber ich bin an der URL-Zuordnung als allgemeine Lösung für viele Probleme interessiert.

Ein weiterer wichtiger Grund, etwas wie dieses zu verwenden, ist RESTful URLs zu haben.

Antwort

2

Kann nicht in PHP als solche getan werden. Beachten Sie, dass es in Java nicht die Servlets sind, die URLs mappen, sondern die Konfiguration des Servlet-Containers (z. B. Tomcat).

Sie können ähnliche Ergebnisse für PHP-Anwendungen erreichen, indem URL rewriting.

2

mit Das klingt wie etwas, das mod_rewrite würde in der Regel für verwendet werden (als Teil von Apache, PHP nicht.) Ich habe nicht von irgendetwas in PHP gehört die würde dies erreichen.

13

Anders als mod_rewrite Wie bereits berichtet, können Sie mit einem einfachen Trick ein wenig Magie machen.

in die .htaccess Legen Sie eine Richtlinie wie diese

<FilesMatch "^servlet$"> 
    ForceType application/x-httpd-php 
</FilesMatch> 

Ersatz^Servlet $ mit einem regulären Ausdruck Ihrer Wahl (es wird der Name Ihres Dispatcher sein)

Die Datei Servlet sollte ähnlich sein kann, die Form haben auf diese

<?php 
    $data = explode('/',$HTTP_SERVER_VARS['PATH_INFO']); // $data[0] always empty 
    $fileToInclude = $data[1].'.php'; 
    if (file_exists($data[1]) { 
    $params=array_slice($data,2); // you can do here something more sophisticated 
            // for example sanitize parameters or assemble 
            // an hash 
    include ($fileToInclude);  //Think to this file as a servlet 
    } else { 
    // issue a 404 error, maybe one of the 500 series 
    } 
?> 

die url: http://yoursite/servlet/reports/sales/2009 Sie auch die Form erreichen können http://yoursite/reports/sales/2009 plaiyng ein wenig mit den .htacces und dem Dispatcher.

Diese Methode hat den Vorteil, dass mod_rewrite nicht als FilesMatch (1.3+) und ForceType (2.0+) sind in dem Apache-Kern

Siehe Referenz
http://httpd.apache.org/docs/2.2/mod/core.html#forcetype
http://httpd.apache.org/docs/2.2/mod/core.html#filesmatch
http://www.devarticles.com/c/a/Apache/Using-ForceType-For-Nicer-Page-URLs/1/

2

Wie andere erwähnt haben, können Sie mod_rewrite verwenden, um dies zu tun, aber Sie könnten auch ein Front-Controller-Entwurfsmuster verwenden, was viele der Web-Frameworks verwenden. Werfen Sie einen Blick auf Horde routes oder Zend_Controller_Router_Rewrite, die für MVC verwendet werden können,

12

Ein Trick, den ich verwende, ist der $ _ SERVER ['PATH_INFO'] (ich denke, Sie brauchen Apache). Dadurch erhalten Sie alle Informationen nach der PHP-Dateierweiterung.

http://www.example.com/page.php/rest/url 

die $ _ SERVER [ 'PATH_INFO'] enthält:

"/rest/url" 

Die Seite kann dann einen Code umleiten, verarbeiten oder was auch immer auf dieser Zeichenfolge basiert.

Das ist gut, wenn Sie keinen Zugriff auf die Apache-Konfigs oder .HTACCESS haben. Auch wenn sich Dinge ändern, können Sie page.php einen Verzeichnisnamen für die statische Dateiplatzierung machen. Oh und PHP muss keine .php Erweiterung haben. Ich habe .api oder sowas in der Vergangenheit benutzt.

Das scheint für mich gut zu funktionieren.

+0

Dies funktioniert auch in Lighttpd. – neu242