WordPress mit benutzerdefinierten Permalinks und ohne .htaccess-Datei einrichten?

7

Ich habe einen Client, der .htaccess-Dateien stark deaktiviert, weil er die Apache-Konfigurationen selbst festlegen möchte. Sie möchten jedoch weiterhin SEO-freundliche URLs.

Gibt es eine Möglichkeit, benutzerdefinierte Permalinks ohne .htaccess-Datei zu erstellen? Meine bisherigen Forschungen scheinen darauf hinzudeuten, dass dies nicht möglich ist, aber vielleicht weiß einer der brillanten Entwickler, wie das scheinbar Unmögliche möglich sein kann. Danke im Voraus!

Mike Lee
quelle
2
Können Sie die Datei httpd.conf ändern (oder darum bitten)?
Gelatine
Wenn es absolut unmöglich ist, benutzerdefinierte Permalinks ohne eine .htaccess-Datei zu haben, gebe ich ihnen ihre Alternativen: 1) keine SEO-freundlichen URLs oder 2) SEO-freundliche URLs und eine htaccess-Datei. Dies sind die einzigen realisierbaren Optionen, die ich derzeit sehe, aber wenn ich falsch liege, würde ich gerne korrigiert werden. :)
Mike Lee

Antworten:

15

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.phpin 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_rewritesollte 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 .PHPDateien und manchmal mit übergebenen URL-Parametern. Letztendlich legen die Regeln fest, dass tatsächliche Dateien geladen werden.

Und mod_rewriteist entweder .htaccessoder konfigurierthttpd.conf

Zum Konfigurieren können mod_rewriteSie dies nur innerhalb .htaccessoder innerhalb der httpd.confDatei 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 .htaccessDatei

Wenn Sie Permalinks festlegen, schreibt WordPress Folgendes in die .htaccessDatei, 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 /blogdie .htaccessgeschriebene 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 .htaccessdie Zuordnung einer URL zur Domain /index.php(oder /blog/index.phpim zweiten Beispiel), es sei denn, eine URL stimmt mit einer tatsächlichen Datei überein (z. B. ein .jpg/ .gif/ .pngBild, ein .cssStylesheet, ein .jsSkript, usw.) oder wenn es mit einem tatsächlichen Verzeichnis übereinstimmt (was meines Wissens in einer Standard-WordPress-Installation nicht relevant ist.)

In PHPWordPress Parses, um $_SERVER['REQUEST_URI']zu entscheiden, was geladen werden soll

In seinem PHPCode erfasst WordPress den Wert, der $_SERVER['REQUEST_URI']die vollständige URL-Anforderung ohne Domain und Schema enthält (dh Schema ist httpoder 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 .htaccessIhren 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 .htaccessDatei.

Ich gebe es nur ungern zu, aber das habe ich um 1998 mit einer .ASPWebsite gemacht, als ich das IISUmschreiben 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.confoder 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 .htaccessund die Kontrolle wieder in ihre Hände legen. Noch besser ist es etwas leistungsfähiger, da httpd.confes nur einmal geladen wird, wenn Apache gestartet wird, aber .htaccessDateien 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:

MikeSchinkel
quelle
Vielen Dank für die äußerst hilfreiche und gründliche Antwort, wie immer! Der Client neigt dazu, die httpd.conf zu ändern, und das werden wir höchstwahrscheinlich am Ende tun. Der Leistungsschub ist auch ein guter Bonus-Tipp!
Mike Lee
@ Mike Lee : Ja, es ist immer schön, wenn du sagen kannst "Du solltest es wirklich so machen und übrigens bekommst du eine bessere Leistung, wenn du das tust !" Ich finde, das beeinflusst sie oft. :)
MikeSchinkel
Ich möchte meine Firma dazu bringen, auf den NGINX-Zug zu springen. Es ist wirklich ein schönes Stück Software. Ich habe es für eine kleine Site eingerichtet, die ich erstellt habe, und SNAP war es schnell!
Dan Gayle
2

Permalinks ohne mod_rewrite

Ohne eine .htaccess-Datei oder ohne Änderung Ihrer httpd.conf-Datei können Sie am besten pathinfo-Permalinks erstellen. Pathinfo-Permalinks sind dieselben wie hübsche Permalinks, außer dass sie mit index.php beginnen.

Um Pathinfo-Permalinks zu verwenden, setzen Sie index.php / an den Anfang Ihrer benutzerdefinierten Permalink-Struktur:

/index.php/%postname%/

Weitere Informationen finden Sie im Codex-Artikel .

Chris_O
quelle
@Chris_O : Ich möchte kein Idiot sein, also werde ich nicht, aber ich muss sagen, ich erschrecke wirklich, wenn ich sehe, dass Leute diese Lösung verwenden. Ich weiß, dass Sie nur versucht haben, angesichts der angegebenen Einschränkungen zu helfen, aber meiner Meinung nach ist dieser Ansatz benutzerfeindlich, verzögert das Teilen von sozialen Netzwerken und lässt es schlimmer aussehen, als hätten Amateure die Website eingerichtet. Aber dann habe ich vor einigen Jahren den Blog a blog.welldesignedurls.org gestartet , also habe ich ein bisschen eine ideologische Neigung zu solchen Dingen. :)
MikeSchinkel
@Chris_) : Um ganz klar zu sein, meine Kommentare waren auf die Lösung gerichtet, nicht auf Sie; du bist großartig! Ich wollte nur, dass du das weißt. :)
MikeSchinkel
Keine Beleidigung genommen. Nur die einzige mir bekannte Lösung anzubieten, verwendet weder .htaccess noch httpd.conf. Einverstanden, dass es nicht ideal ist, aber ich würde es lieber über example.org/?p=123 verwenden, wenn es meine EINZIGE Wahl wäre.
Chris_O
1
Ich bin damit einverstanden, dass dies nicht der ideale Weg ist, aber ich schätze den Vorschlag als Alternative. Und viel besser als example.org/?p=123!
Mike Lee
0

In den schlechten alten Zeiten musste WordPress jedes Mal, wenn Sie die Permalink-Struktur änderten, eine neue Konfigurationsdatei schreiben. In modernen Setups bleiben die RewriteRules unverändert:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Alle Anforderungen für nicht vorhandene Dateien (dh ein benutzerdefinierter Permalink-Pfad, der nicht mit einer Datei im Dateisystem übereinstimmt) werden über index.php weitergeleitet und $_SERVER['REQUEST_URI']teilen PHP mit, was tatsächlich angefordert wurde. Ihr Client kann die Umschreiberegeln in httpd.conf oder .htaccess festlegen, und Sie müssen sie nicht ändern, wenn Sie die Permalink-Struktur optimieren.

Einige Plugins versuchen, .htaccess selbst zu ändern, oder fordern Sie auf, die Datei zu ändern. Diese Lösung ist vielleicht nicht jedermanns Sache, aber es lohnt sich, darüber nachzudenken.

Annika Backstrom
quelle
Danke für die Antwort. Der Client neigt gerade dazu, die httpd.conf zu ändern.
Mike Lee