Hallo @Mike Lee :
Um Ihre Frage zu beantworten, ist es hilfreich zu verstehen, wie alles funktioniert.
Apache stellt URLs bereit, die mit Dateien und Verzeichnissen übereinstimmen
Apache wurde entwickelt, um Dateien bereitzustellen, die explizit mit der URL übereinstimmen, oder um die index.php
in einem Verzeichnis gefundenen Dateien bereitzustellen, wenn das Verzeichnis explizit übereinstimmt.
Apache kann jedoch URLs bereitstellen, mit denen Regex übereinstimmt mod_rewrite
Wenn Sie möchten, dass Apache mit URLs übereinstimmt, für die es keine echten Verzeichnisse gibt (dies ist bei WordPress und hübschen Permalinks der Fall), müssen Sie Apache auf irgendeine Weise mitteilen können, wie URLs anders behandelt werden sollen. Und genau das mod_rewrite
sollte es ermöglichen. Serveradministratoren können mithilfe regulärer Ausdrücke Regeln für den Abgleich von URLs festlegen. Diese Regeln leiten das Ergebnis an andere URLs weiter, häufig einschließlich tatsächlicher .PHP
Dateien und manchmal mit übergebenen URL-Parametern. Letztendlich legen die Regeln fest, dass tatsächliche Dateien geladen werden.
Und mod_rewrite
ist entweder .htaccess
oder konfigurierthttpd.conf
Zum Konfigurieren können mod_rewrite
Sie dies nur innerhalb .htaccess
oder innerhalb der httpd.conf
Datei oder einer der darin enthaltenen Dateien tun , wie dies möglicherweise der Fall ist httpd-vhosts.conf
. Eigentlich bin ich überrascht, wenn Ihr Client die Fähigkeiten hat, Apache zu steuern, dass er dies noch nicht weiß.
WordPress verwendet immer dieselbe einfache .htaccess
Datei
Wenn Sie Permalinks festlegen, schreibt WordPress Folgendes in die .htaccess
Datei, sofern diese beschreibbar ist ( und in diesem ersten Beispiel davon ausgegangen, dass Ihre Website vom Stammverzeichnis aus bereitgestellt wird ):
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Vorsichtsmaßnahme: Wenn Ihr WordPress-Startseitenverzeichnis nicht root ist
Wenn Ihre Site stattdessen von dort aus bereitgestellt wird, sieht /blog
die .htaccess
geschriebene Datei folgendermaßen aus:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>
WordPress leitet alle Nicht-Datei- / Verzeichnis-übereinstimmenden URLs an weiter index.php
Wie Sie sehen können, verwendet WordPress nur .htaccess
die Zuordnung einer URL zur Domain /index.php
(oder /blog/index.php
im zweiten Beispiel), es sei denn, eine URL stimmt mit einer tatsächlichen Datei überein (z. B. ein .jpg
/ .gif
/ .png
Bild, ein .css
Stylesheet, ein .js
Skript, usw.) oder wenn es mit einem tatsächlichen Verzeichnis übereinstimmt (was meines Wissens in einer Standard-WordPress-Installation nicht relevant ist.)
In PHP
WordPress Parses, um $_SERVER['REQUEST_URI']
zu entscheiden, was geladen werden soll
In seinem PHP
Code erfasst WordPress den Wert, der $_SERVER['REQUEST_URI']
die vollständige URL-Anforderung ohne Domain und Schema enthält (dh Schema ist http
oder https
), und analysiert dann den Wert, um zu bestimmen, welche URL angefordert wurde und welche Seiten geladen werden sollen.
Umgehen .htaccess
? Lassen Sie Apache virtuelle URLs laden (aber viel Glück damit!)
Wenn Sie also .htaccess
Ihren Job irgendwie umgehen möchten, müssen Sie Apache dazu bringen, auf eine beliebige URL zu antworten. Laden Sie dann WordPress und legen Sie $_SERVER['REQUEST_URI']
den URL-Pfad plus die Parameter fest. IOW fälscht es aber auf eine gute Weise. Das heißt, ich weiß, wenn ich keine Möglichkeiten kenne, die nicht allzu kompliziert sind, dies zu tun.
Einbetten /index.php/
(Vielleicht?!?)
Auch wenn * Chris_O * richtig ist, wenn es darum geht /index.php/
, Ihren URLs voranzukommen , erschrecke ich, wenn ich das sehe. Es fügt jeder URL 10 Zeichen hinzu, wodurch sie für Suchmaschinen länger und weniger aussagekräftig werden, aber weitaus schlimmer macht sie weniger gemeinsam nutzbar und sieht für Benutzer kryptisch aus. Sorry Chris, ich weiß, dass du es gut gemeint hast, aber ugh!
Erstellen Sie echte Verzeichnisse für jede URL (vielleicht?)
Eine Möglichkeit, hübsche Permalinks zu erhalten, ohne Apache zu berühren, besteht darin, ein Skript zu schreiben, das ein tatsächliches Verzeichnis für jede gewünschte URL generiert und dort ein Verzeichnis speichert index.php
, das WordPress lädt. Das wäre natürlich ein enormer Aufwand für einen winzigen Vorteil und würde erfordern, dass der Server über einen Schreibzugriff verfügt, der schlechter sein muss als die Verwendung einer .htaccess
Datei.
Ich gebe es nur ungern zu, aber das habe ich um 1998 mit einer .ASP
Website gemacht, als ich das IIS
Umschreiben von URLs nicht unterstützte (und auch heute noch ist es eine echte PITA!). Es war ein hässlicher Hack, es war ein Schmerz zu pflegen und ich hasste es Aber die URLs waren sowohl für Benutzer als auch für SEO großartig!
Beste Lösung? Fügen Sie Rewrite Rules hinzuhttpd.conf
Zurück zu der wahrscheinlich besten Lösung, und @Simon Brown hat sie tatsächlich empfohlen. Fügen Sie Ihre Umschreiberegeln zu httpd.conf
oder einer der Include-Dateien hinzu httpd-vhosts.conf
(wie Apache bei localhost auf meinem Mac konfiguriert ist). Fügen Sie die folgende Anweisung hinzu, und stellen Sie sicher, dass Sie das Verzeichnis so ändern, dass es mit dem Verzeichnis für Ihre Site übereinstimmt:
<Directory "/home/example_user/public_html/">
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
Bonus! Mit Lockdown kommt auch die Leistung
Diese letzte Option sollte alle eliminieren .htaccess
und die Kontrolle wieder in ihre Hände legen. Noch besser ist es etwas leistungsfähiger, da httpd.conf
es nur einmal geladen wird, wenn Apache gestartet wird, aber .htaccess
Dateien bei jeder URL-Anfrage geladen und analysiert werden!
PS Eine weitere zu berücksichtigende Sache wäre, Apache mit einem Caching-Server wie Nginx zu versehen, was meiner Meinung nach zu einer bewährten Methode für stark frequentierte WordPress-Sites wird , die wirklich leistungsfähig sein müssen. Es könnte einige Anpassungen auf der grünen Wiese erfordern, da ich nicht glaube, dass die meisten Leute Nginx verwendet haben, um die URL für Apache neu zu schreiben, aber wenn diese Richtung Sie interessiert, sind hier einige Links zu verfolgen: