Ich habe einen Client, der es vorzieht, .htaccess-Dateien zu deaktivieren, da sie gerne die Apache-Konfigurationen selbst festlegen. Dennoch möchten sie SEO-freundliche URLs.
Gibt es eine Möglichkeit, benutzerdefinierte Permalinks ohne .htaccess-Datei zu haben? Meine bisherigen Untersuchungen deuten darauf hin, dass dies nicht möglich ist, aber vielleicht weiß einer der brillianten Entwickler, wie das scheinbar Unmögliche möglich ist. Danke im Voraus!
Hallo @ Mike Lee :
Um Ihre Frage zu beantworten, ist es hilfreich zu verstehen, wie alles funktioniert.
Apache dient dazu, Dateien zu liefern, die explizit mit URL abgeglichen wurden, oder um die index.php
in einem Verzeichnis zu finden, wenn das Verzeichnis explizit zugeordnet ist.
mod_rewrite
Wenn Sie möchten, dass Apache die URLs für keine echten Verzeichnisse (mit WordPress und hübschen Permalinks) abgleicht, müssen Sie dem Apache eine Möglichkeit geben, mit URLs anders umzugehen. Und das ist genau das, was mod_rewrite
ermöglicht hat; Serveradministratoren können Regeln für die Übereinstimmung von URLs mit regulären Ausdrücken festlegen. Diese Regeln .PHP
das Ergebnis an andere URLs weiter, oft einschließlich tatsächlicher .PHP
Dateien und manchmal mit übergebenen URL-Parametern. Letztendlich geben die Regeln an, dass die tatsächlichen Dateien geladen werden.
mod_rewrite
wird entweder mit .htaccess
oder httpd.conf
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, wie httpd-vhosts.conf
. Eigentlich bin ich überrascht, wenn Ihr Client die Fähigkeiten hat, Apache zu kontrollieren, dass sie das nicht schon wissen.
.htaccess
Datei Wenn Sie WordPress verwenden, schreibt WordPress beim Setzen von Permalinks Folgendes in die .htaccess
Datei, vorausgesetzt, es ist beschreibbar ( und in diesem ersten Beispiel vorausgesetzt, dass Ihre Website-Site von der Wurzel aus bedient wird ):
# BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress
Wenn Ihre Site stattdessen von /blog
.htaccess
wird, würde die .htaccess
Datei folgendermaßen aussehen:
RewriteEngine On RewriteBase /blog/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /blog/index.php [L]
index.php
Wie Sie sehen, verwendet WordPress nur .htaccess
für die Zuordnung einer beliebigen URL zur Domain zu /index.php
(oder /blog/index.php
im zweiten Beispiel), außer wenn eine URL mit einer tatsächlichen Datei übereinstimmt (z B. ein .jpg
/ .gif
/ .png
Bild, ein .css
Stylesheet, ein .js
Skript usw.) oder wenn es einem tatsächlichen Verzeichnis entspricht (was .js
in einer Standard-WordPress-Installation nicht relevant ist.)
PHP
WordPress analysiert $_SERVER['REQUEST_URI']
zu entscheiden, was $_SERVER['REQUEST_URI']
Innerhalb seines PHP
Codes greift WordPress auf den Wert von $_SERVER['REQUEST_URI']
der die vollständige URL-Anfrage ohne Domäne und Schema enthält (dh das Schema ist http
oder https
) und parst dann den Wert, um zu bestimmen, welche URL angefordert wurde Seiten sollte es laden.
.htaccess
? Lass Apache virtuelle URLs laden (aber viel Glück damit!) Wenn Sie also .htaccess
umgehen möchten, wäre Ihr Job, Apache auf eine beliebige URL zu reagieren, dann WordPress zu laden und $_SERVER['REQUEST_URI']
als URL-Pfad plus Parameter zu setzen; IOW spoofing es aber auf eine gute Art und Weise. Das heißt, ich weiß, wenn keine Wege bekannt sind, die nicht übermäßig kompliziert sind, das zu tun.
/index.php/
(Vielleicht?!?) Auch wenn * Chris_O * über das Voranstellen von /index.php/
auf deine URLs korrekt ist, schaudere ich, wenn ich das sehe. Es fügt jeder URL 10 Zeichen hinzu, was sie für Suchmaschinen länger und weniger aussagekräftig macht, aber viel schlechter macht sie weniger geteilt und sieht für die Benutzer kryptisch aus. Entschuldigung Chris Ich weiß, dass du es gut meintest , aber hm!
Eine Möglichkeit, schöne Permalinks zu erhalten, ohne Apache zu berühren, wäre, ein Skript zu schreiben, das für jede gewünschte URL ein index.php
Verzeichnis erzeugt und dann dort eine index.php
speichert, die WordPress lädt. Natürlich wäre das ein großer Aufwand für einen kleinen Vorteil und es würde erfordern, dass der Server Schreibzugriff hat, der schlechter sein muss als eine .htaccess
Datei zu verwenden.
Ich hasse es zuzugeben, aber das habe ich 1998 mit einer .ASP
basierten Website gemacht, als IIS
URL-Rewriting nicht unterstützt hat (und auch heute ist es immer noch eine echte PITA!) Es war ein hässlicher Hack, war ein Schmerz zu pflegen und Ich hasste es, aber die URLs waren großartig sowohl für die Nutzer als auch für SEO!
httpd.conf
Zurück zu dem, was wahrscheinlich deine beste Lösung ist, und @Simon Brown hat es tatsächlich empfohlen; httpd.conf
Sie Ihre Umschreibungsregeln zu httpd.conf
oder einer der Include-Dateien wie httpd-vhosts.conf
(so ist Apache auf meinem Mac auf localhost konfiguriert.) Fügen Sie die folgende statement hinzu, um sicherzustellen, dass das Verzeichnis dem Verzeichnis für Ihren httpd-vhosts.conf
Seite? ˅:
RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
Diese letzte Option sollte alle .htaccess
eliminieren und die Kontrolle zurück in ihre Hände legen. Noch besser ist es etwas leistungsfähiger, da httpd.conf
nur einmal beim Start von Apache geladen wird, aber .htaccess
Dateien werden bei jeder URL-Anfrage geladen und geparst!
PS Eine weitere Sache wäre, Apache mit einem Caching-Server wie Nginx zu konfrontieren, von dem ich glaube, dass es eine Best Practice für stark frequentierte WordPress-Sites wird , die wirklich performant sein müssen. Es könnte eine Optimierung des grünen Feldes erfordern, da ich glaube nicht, dass die meisten Leute Nginx benutzt haben, um das URL-Rewriting für Apache durchzuführen, aber wenn diese Richtung dich interessiert, sind hier einige Links zu verfolgen:
Permalinks ohne mod_rewrite
Ohne eine .htaccess-Datei oder die Änderung Ihrer httpd.conf-Datei können Sie am besten performinfo permalinks. 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 / am Anfang Ihrer benutzerdefinierten Permalink-Struktur:
/index.php/%postname%/
Weitere Informationen finden Sie im Codex-Artikel .
Zurück in den Schlechten Alten Tagen musste WordPress jedes Mal, wenn Sie die Permalink-Struktur änderten, eine neue Konfigurationsdatei schreiben. In modernen Setups sind die RewriteRules unverändert:
# BEGIN WordPress RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress
Alle Anfragen für nicht existierende Dateien (dh ein benutzerdefinierter Permalink-Pfad, der nicht mit einer Datei im Dateisystem übereinstimmt) werden durch index.php weitergeleitet, und $_SERVER['REQUEST_URI']
teilt PHP mit, was tatsächlich angefordert wurde. Ihr Client kann die Umschreibungsregeln in httpd.conf oder .htaccess festlegen, und Sie müssen ihn nicht ändern, während Sie die Permalink-Struktur optimieren.
Einige Plugins versuchen, .htaccess selbst zu modifizieren oder Sie zu bitten, die Datei zu modifizieren. Diese Lösung ist vielleicht nicht jedermanns Sache, aber es lohnt sich, darüber nachzudenken.