Einrichten mit WordPress Benutzerdefinierte Permalinks und Nein .htaccess-Datei?
-
16-10-2019 - |
Frage
Ich habe einen client, der stark bevorzugt zu deaktivieren .htaccess-Dateien, weil Sie, wie die Apache-Konfigurationen selbst.Jedoch, Sie wollen immer noch SEO-freundliche URLs.
Gibt es eine Möglichkeit, benutzerdefinierte permalinks mit Nein .htaccess-Datei?Meine Forschung bisher scheint dies nicht möglich ist, aber vielleicht ist eine der Brillanten Entwickler weiß, wie man das scheinbar Unmögliche möglich sein kann.Vielen Dank im Voraus!
Lösung
Hi @Mike Lee:
Um deine Frage zu beantworten, ist es hilfreich zu verstehen, wie alles funktioniert.
Apache Dient URLs, die Spiel-Dateien und Verzeichnisse
Apache ist entworfen, um zu dienen-Dateien explizit abgestimmt durch URL oder dienen der index.php
gefunden in einem Verzeichnis wenn das Verzeichnis explizit aufeinander abgestimmt sind.
Aber Apache Dienen Können, - URLs Matched by Regex mit mod_rewrite
Wenn Sie möchten, dass der Apache zu entsprechen, URLs, wo es keine echten Verzeichnisse (der Fall mit WordPress-und ziemlich permalinks), dann müssen Sie die Möglichkeit haben, zu sagen, Apache, wie handle URLs unterschiedlich.Und das ist genau das, was mod_rewrite
entworfen wurde, zu ermöglichen;es gibt server-Administratoren das festlegen von Regeln für den Abgleich von URLs mit regulären Ausdrücken.Diese Regeln, die route der Folge zu anderen URLs, oft auch tatsächlich .PHP
Dateien und manchmal auch mit URL-Parameter übergeben.Letztlich sind die Regeln, die angeben, dass die tatsächlichen Dateien geladen werden.
Und mod_rewrite
Konfiguriert ist, wobei Entweder .htaccess
oder httpd.conf
Konfigurieren mod_rewrite
Sie können nur tun es im inneren .htaccess
oder innerhalb der httpd.conf
Datei oder eine Datei, die es enthält, wie potenziell httpd-vhosts.conf
.Ich bin tatsächlich überrascht, wenn Sie Kunde hat die Fähigkeiten zur Handhabung des Apache, dass Sie nicht bereits wissen.
WordPress Verwendet Immer die Gleiche, Einfache .htaccess
Datei
Bewegen Sie sich auf das, was WordPress funktioniert, wenn Sie permalinks WordPress schreibt Folgendes zu der .htaccess
Datei, vorausgesetzt, es ist beschreibbar (und in diesem ersten Beispiel angenommen, Ihre website ist gedient von der Wurzel):
# 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
VORBEHALT:Wenn Sie Ihre WordPress-Titelseite Nicht-Root-Verzeichnis
Wenn Sie Ihre Website stattdessen serviert /blog
dann die .htaccess
- Datei geschrieben würde wie folgt Aussehen:
<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 Routen Alle Nicht-Datei - /Verzeichnis-Matching URLs index.php
So wie Sie sehen können, ist die einzige Sache, die WordPress verwendet wird .htaccess
zur Karte alle URL der Domäne /index.php
(oder /blog/index.php
im 2. Beispiel) außer wenn eine URL entspricht einer tatsächlichen Datei (wie eine .jpg
/.gif
/.png
Bild ein .css
ein stylesheet ein .js
Skript, etc.) oder wenn es passt eine aktuelle Verzeichnis (in dem soweit ich weiß, ist nicht relevant in einer standard-WordPress-Installation.)
In PHP
WordPress Analysiert $_SERVER['REQUEST_URI']
Um zu Entscheiden, Welche zu Laden
In seiner PHP
code WordPress schnappt sich den Wert von $_SERVER['REQUEST_URI']
enthält die vollständige URL-Anforderung sans die Domänen-und Schema (d.h.Schema http
oder https
) und anschließend analysiert der Wert, um zu bestimmen, welche URL angefordert wurde und damit, welche Seiten Sie sollte Belastung.
Umgehung .htaccess
?Holen Sie sich den Apache Geladen Virtuelle URLs (aber viel Glück damit!)
Also, wenn Sie möchten, um irgendwie zu umgehen .htaccess
Ihr job wäre, Apache, um zu reagieren, um eine beliebige URL dann lade WordPress und setzen $_SERVER['REQUEST_URI']
der URL-Pfad und Parameter;IOW-spoofing ist es aber in einem guten Weg.Das heißt, ich weiß, wenn kenne keine Möglichkeiten, die sind nicht übermäßig kompliziert, das zu tun.
Einbetten /index.php/
(Vielleicht?!?)
Obwohl *Chris_O* korrekt über voranstellen /index.php/
um deine URLs, die ich kriechen, wenn ich sehe, dass.Es fügt 10 Zeichen, um alle URL-zu machen Sie länger und weniger sinnvolle Suchmaschinen aber weit schlimmer macht diese weniger geteilt werden und sieht kryptisch für die Benutzer.Sorry Chris, ich weiß, Sie meinte es gut, aber ugh!
Erstellen Sie Echte Verzeichnisse für Jede URL (Vielleicht?)
Ein Weg, wie man ziemlich permalinks ohne Sie zu berühren Apache würde ein Skript schreiben, das wäre generieren eine tatsächliche Verzeichnis für jede URL, die Sie möchten, und speichern Sie dann eine index.php
es würde laden von WordPress.Natürlich wäre enormer Aufwand für die kleinen nutzen und würde es erfordern, dass der server über Schreibzugriff, die schlimmer sein als der Einsatz eines .htaccess
Datei.
Ich hasse es zu zugeben, aber das ist, was ich Tat, circa 1998 mit ein .ASP
-website, wenn IIS
nicht unterstützt URL-rewriting (und ist auch heute noch eine echte PITA!) Es war ein hässlicher hack, war ein Schmerz zu halten, und ich hasste es, aber die URLs sicher waren großartig für Nutzer und für SEO!
Beste Lösung?Add Rewrite-Regeln zu httpd.conf
Zurück zu dem, was ist wahrscheinlich die beste Lösung, und @Simon Brown tatsächlich wird empfohlen, es;add rewrite-Regeln httpd.conf
oder eine der include-Dateien wie httpd-vhosts.conf
(das ist wie der Apache wird konfiguriert unter localhost auf meinem Mac.) Fügen Sie die folgende Direktive zu machen Sie sicher, dass das Verzeichnis übereinstimmen, das Verzeichnis für Ihre Website:
<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, Die Leistung Zu
Diese Letzte option sollte beseitigen .htaccess
und Kontrolle wieder in Ihren Händen.Noch besser ist es etwas schneller, da httpd.conf
wird nur einmal geladen, wenn der Apache startet aber .htaccess
die Dateien werden geladen und analysiert auf jede URL-Anforderung!
P. S.Eine weitere Sache zu berücksichtigen wäre front-end-Apache mit einem caching-server wie Nginx was ich glaube ist immer ein best practice für high-traffic WordPress-sites dass wirklich brauchen, um performant.Es könnte auf der grünen wiese zwicken, da ich nicht denke, die meisten Menschen wurden mit Nginx zu tun, das URL-rewriting von Apache, aber wenn diese Richtung, die Sie interessiert, hier sind einige links verfolgen:
- WordPress-Nginx-proxy-cache-integrator
- Mit Nginx als caching-proxy mit Wordpress+Apache
- Nginx als Frontend-proxy-cache für WordPress
- WordPress, Nginx und WP Super Cache
- Nginx & WordPress MU-w/ wp-super-cache
- Wie Zu beschleunigen WordPress Mit Nginx Und WP Super Cache
- Nginx Rewrite-Regeln für W3 Total Cache Plugin
- Optimieren Sie Nginx für WordPress – Pretty URLs & WP Super Cache
Andere Tipps
Permalinks ohne mod_rewrite
Ohne eine .htaccess -Datei oder das Ändern Ihrer httpd.conf -Datei ist pathInfo permalinks am besten. Pathinfo Permalinks entsprechen den hübschen Permalinks, außer dass sie mit index.php beginnen.
Um pathInfo permalinks zu verwenden, setzen Sie index.php/ zu Beginn Ihrer benutzerdefinierten Permalink -Struktur:
/index.php/%postname%/
Siehe das Codex -Artikel für mehr Informationen.
In den schlechten alten Zeiten musste WordPress jedes Mal, wenn Sie die Permalink -Struktur geändert haben, eine neue Konfigurationsdatei schreiben. In modernen Setups sind die Rewritriterules unveränderlich:
# 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 für nicht existierende Dateien (dh ein benutzerdefinierter Permalink-Pfad, der nicht mit einer Datei im Dateisystem übereinstimmt) wird durch index.php weitergeleitet und wird übergeben. $_SERVER['REQUEST_URI']
sagt PHP, was tatsächlich angefordert wurde. Ihr Client kann die Umschreiben der Regeln 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 bitten Sie, die Datei zu ändern. Diese Lösung ist vielleicht nicht jedermanns Sache, aber es lohnt sich, in Betracht zu ziehen.