2008-11-09 6 views
8

Ich entwickle eine PHP-Website, die URL-Routing verwendet. Ich möchte, dass die Site verzeichnisunabhängig ist, so dass sie von http://site.example.com/ zu http://example.com/site/ verschoben werden kann, ohne jeden Pfad im HTML ändern zu müssen. Das Problem tritt auf, wenn ich auf Dateien verlinke, die nicht dem Routing unterliegen, wie CSS-Dateien, Bilder und so weiter.Wie Sie eine Website mit URL-Routing-Verzeichnis unabhängig halten

Nehmen wir zum Beispiel an, dass die Ansicht für die Aktion index des Controllers welcome das Bild img/banner.jpg enthält. Wenn die Seite mit der URL http://site.example.com/welcome angefordert wird, fordert der Browser das Bild als http://site.example.com/img/banner.jpg an, was völlig in Ordnung ist. Aber wenn die Seite mit der URL http://site.example.com/welcome/index angefordert wird, wird der Browser denken, dass welcome ein Verzeichnis ist und versuchen wird, das Bild als http://site.example.com/welcome/img/banner.jpg zu holen, was offensichtlich falsch ist.

Ich habe bereits einige Optionen in Betracht gezogen, aber sie scheinen alle unvollkommen zu mir:

  • Verwenden URL-Rewriting zur Umleitung von Anforderungen (* .css | * .js | ...) oder (css/* | js/* | ...) auf den richtigen Pfad.

    Probleme: Jede Erweiterung müsste in den Rewrite-Regeln benannt werden. Wenn jemand einen neuen Dateityp (z. B. eine MP3-Datei) hinzufügen würde, würde er nicht neu geschrieben werden.

  • Den Basispfad zu jedem relativen Pfad mit einer PHP-Funktion voranstellen. Zum Beispiel:
    <img src="<?php echo url::base(); ?>img/banner.jpg" />

    Probleme: Sieht aus chaotisch; css - und js -Dateien, die Pfade enthalten, müssten von PHP verarbeitet werden.

Also, wie halten Sie ein Website-Verzeichnis unabhängig? Gibt es einen besseren/saubereren Weg als die, die mir einfallen?

Antwort

8

könnten Sie in den Kopf setzen

<base href="<?php echo url::base(); ?>" /> 

den Browser Dies bedeutet, werden alle nicht-absolute URLs in Bezug auf diesen Pfad fordern. Ich bin mir jedoch nicht sicher, wie dies sich auf URLs auswirken würde, die in CSS-Dateien usw. eingebettet sind. Dies wirkt sich nicht auf Pfade aus, die in CSS-Dateien definiert sind. (danke mooware)

+0

Gemäß der CSS-Spezifikation werden URLs in CSS-Dateien relativ zum Pfad der Datei aufgelöst, in der sie definiert sind. Daher beeinflusst das Basis-Tag sie überhaupt nicht. Ich habe es versucht und es funktioniert wirklich so. – mooware

1

Tomhaigh hat einen guten Punkt, und es würde sich lohnen, es weiter zu untersuchen.

Nach MSDN, die base Tag funktioniert für alle anderen Quellen, einschließlich Stylesheets, Bilder, usw.

1

Vielleicht bin ich etwas fehlt, kann aber nicht einfach tun, was ich (und ich dachte, jeder sonst tut? setzen nämlich alle Ihre Bilder, CSS, JavaScripts, etc. in einem gemeinsamen Verzeichnis d.h .:

/inc/images/ 
/inc/css/ 
/inc/javascript/ 
etc 

Und dann verweisen sie mit basen relative URLs, das heißt:

<img src="/inc/images/foo.jpg" /> 
etc 

?

2

Die <base> Sache wird funktionieren, aber Sie müssen daran denken, es wird auch Auswirkungen auf Ihre <a> Tags. Betrachten Sie dieses Beispiel .:

<!-- this page is http://oursite.com/index.html --> 
<html> 
<head> 
    <base href="http://static.oursite.com/" /> 
</head> 
<body> 
    <img src="logo.gif" alt="this is http://static.oursite.com/logo.gif" /> 
    <a href="/login">this links to http://static.oursite.com/login which is not what we wanted. we wanted http://oursite.com/login</a> 
</body> 
</html> 

Wenn Sie einen PHP-Funktion-Aufruf für Ihre Links erstellen, das wird kein Problem sein, wie Sie nur sicher, dass es absolute URL spuckt machen können. Aber wenn Sie (oder Ihre Designer) die <a> Tags manuell codieren, dann stecken Sie wieder mit demselben Problem fest, gerade jetzt mit <a> anstelle von <img>.

EDIT: Ich sollte hinzufügen, der obige Absatz ist davon ausgegangen, dass Sie Bilder von einem anderen Host-Namen, wie wir es tun. Wenn du das nicht tust, wird das offensichtlich kein Problem sein.

+0

War sehr nützlich, als ich eine Subdomain auf ein neues Unterverzeichnis lenkte - ich benutzte deine '

Verwandte Themen