it-swarm.com.de

Einrichten von WordPress mit benutzerdefinierten Permalinks und ohne .htaccess-Datei?

Ich habe einen Client, der es stark vorzieht, .htaccess-Dateien zu deaktivieren, weil sie die Apache-Konfigurationen selbst festlegen möchten. Sie möchten jedoch weiterhin SEO-freundliche URLs.

Gibt es eine Möglichkeit, benutzerdefinierte Permalinks ohne .htaccess-Datei zu erstellen? Meine bisherigen Forschungen scheinen zu zeigen, 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!

7
Mike Lee

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 dient zum Bereitstellen von Dateien, die explizit nach URL abgeglichen werden, oder zum Bereitstellen des in einem Verzeichnis gefundenen index.php, wenn das Verzeichnis explizit abgeglichen wird.

Apache kann jedoch URLs liefern, die von Regex mit mod_rewrite abgeglichen wurden

Wenn Sie möchten, dass Apache mit URLs übereinstimmt, für die es keine echten Verzeichnisse gibt (wie bei WordPress und hübschen Permalinks), müssen Sie Apache auf irgendeine Weise mitteilen, wie URLs unterschiedlich behandelt werden sollen. Und genau dafür wurde mod_rewrite entwickelt. Serveradministratoren können Regeln für übereinstimmende URLs mithilfe regulärer Ausdrücke festlegen. Diese Regeln leiten das Ergebnis an andere URLs weiter, häufig einschließlich .PHP-Dateien und manchmal mit übergebenen URL-Parametern. Letztendlich legen die Regeln fest, dass tatsächliche Dateien geladen werden.

Und mod_rewrite ist entweder mit .htaccess oder mit httpd.conf konfiguriert.

Um mod_rewrite zu konfigurieren, können Sie dies nur innerhalb von .htaccess oder innerhalb der httpd.conf-Datei oder einer der darin enthaltenen Dateien tun, z. B. möglicherweise httpd-vhosts.conf. Eigentlich wundert es mich, wenn Ihr Client die Fähigkeiten hat, Apache zu kontrollieren, die er noch nicht kennt.

WordPress verwendet immer dieselbe einfache .htaccess-Datei

Weiter zu den Funktionen von WordPress: Wenn Sie Permalinks festlegen, schreibt WordPress Folgendes in die Datei .htaccess, sofern diese schreibbar ist (und in diesem ersten Beispiel unter der Annahme, 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-Frontpage-Verzeichnis nicht Root ist

Wenn Ihre Site stattdessen über /blog bereitgestellt wird, sieht die geschriebene .htaccess-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 routet alle nicht mit Datei/Verzeichnis übereinstimmenden URLs zu index.php

Wie Sie sehen können, verwendet WordPress .htaccess nur, umanyURL der Domain zu /index.php (oder /blog/index.php im 2. Beispiel)außerwenn eine URL mit einer tatsächlichen Datei übereinstimmt (z. B. ein .jpg/.gif/.png-Bild, ein .css-Stylesheet, ein .js-Skript usw.) oder wenn sie mit einem tatsächlichen Verzeichnis übereinstimmt (soweit ich weiß) nicht relevant in einer Standard-WordPress-Installation.)

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

In seinem PHPname__-Code erfasst WordPress den Wert von $_SERVER['REQUEST_URI'], der die vollständige URL-Anforderung sans enthält, die Domäne und das Schema (dh Schema ist httpoder httpsname__) und analysiert dann den Wert, um zu bestimmen, welche URL angefordert wurde und somit was Seiten, die geladen werden sollen.

.htaccess umgehen? Holen Sie sich Apache, um virtuelle URLs zu laden (aber viel Glück damit!)

Wenn Sie .htaccess irgendwie umgehen möchten, besteht Ihre Aufgabe darin, Apache zu veranlassen, auf eine beliebige URL zu antworten. Laden Sie dann WordPress und legen Sie $_SERVER['REQUEST_URI'] als URL-Pfad plus Parameter fest. IOW fälscht es aber auf eine gute Art und Weise. Das heißt, ich weiß, ob ich keine Möglichkeiten kenne, die nicht allzu kompliziert sind, das zu tun.

Einbetten von /index.php/ (Vielleicht?!?)

Auch wenn * Chris_O * korrekt ist, /index.php/ vor Ihre URLs zu stellen, schrecke ich zusammen, 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 sind sie weniger gemeinsam nutzbar und wirken für Benutzer kryptisch. Entschuldigung Chris, ich weiß, dass du es gut gemeint hast, aber ugh!

Erstellen Sie echte Verzeichnisse für jede URL (möglicherweise?)

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 einen index.php speichert, der WordPress lädt. Das wäre natürlich ein enormer Aufwand für einen winzigen Vorteil und würde erfordern, dass der Server über Schreibzugriff verfügt, was schlechter sein muss als die Verwendung einer .htaccess-Datei.

Ich gebe nur ungern zu, aber genau das habe ich 1998 mit einer .ASP-basierten Website gemacht, als IISdas Umschreiben von URLs nicht unterstützte (und es ist auch heute noch eine echte PITA!) hasste es, aber die URLs waren großartig für beide Benutzer und für SEO!

Beste Lösung? Schreibregeln zu httpd.conf hinzufügen

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 wie httpd-vhosts.conf hinzu (so wird Apache auf meinem Mac bei localhost konfiguriert). Fügen Sie die folgende Anweisung hinzu, und achten Sie darauf, das Verzeichnis so zu ändern, dass es mit dem Verzeichnis Ihrer 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 Leistung

Diese letzte Option sollte jeden .htaccess eliminieren und die Kontrolle wieder in ihre Hände geben. Noch besser, es ist etwas performanter, da httpd.conf nur einmal beim Start von Apache geladen wird, aber.htaccess-Dateien werden bei jeder URL-Anfrage geladen und analysiert!

P.S. Eine weitere zu berücksichtigende Sache wäre Front-End-Apache mit einem Caching-Server wie Nginx, der meiner Meinung nach zu einem Best Practice für stark frequentierte WordPress-Sites wird das wirklich benötigt wird performant sein. Möglicherweise sind Optimierungen auf der grünen Wiese erforderlich, da meines Erachtens die meisten Benutzer Nginx nicht zum Umschreiben der URL für Apache verwendet haben.

15
MikeSchinkel

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 die gleichen 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 .

2
Chris_O

Früher musste WordPress jedes Mal, wenn Sie die Permalink-Struktur änderten, eine neue Konfigurationsdatei schreiben. In modernen Konfigurationen ändern sich die RewriteRules nicht:

# 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 Anfragen nach nicht existierenden Dateien (dh einem benutzerdefinierten Permalink-Pfad, der nicht mit einer Datei im Dateisystem übereinstimmt) werden über index.php weitergeleitet und $_SERVER['REQUEST_URI'] teilt PHP mit, was tatsächlich angefordert wurde. Ihr Client kann die Umschreiberegeln in httpd.conf oder .htaccess festlegen, und Sie müssen sie beim Ändern der Permalink-Struktur nicht ändern.

Einige Plugins versuchen, .htaccess selbst zu ändern, oder fordern Sie auf, die Datei zu ändern. Diese Lösung ist möglicherweise nicht für jedermann geeignet, aber es lohnt sich, darüber nachzudenken.

0