it-swarm-eu.dev

Nastavení WordPress s vlastní Permalinks a žádný soubor .htaccess?

Mám klienta, který silně upřednostňuje zakázat soubory .htaccess, protože chtějí nastavit konfiguraci Apache sami. Nicméně, oni stále chtějí SEO-přátelské URL.

Existuje způsob, jak mít vlastní permalinks bez souboru .htaccess? Zdá se, že můj výzkum to zatím naznačuje, že to není možné, ale snad jeden z brilantních vývojářů ví, jak zdánlivě nemožné je možné. Díky předem!

7
Mike Lee

Hi @Mike Lee :

Pro zodpovězení vaší otázky je užitečné pochopit, jak vše funguje.

Apache slouží pro URL, které odpovídají souborům a adresářům

Apache je navržen tak, aby sloužil souborům explicitně přiřazeným k URL, nebo aby sloužil jako index.php nalezený v adresáři, když je adresář explicitně přiřazen.

Apache však může sloužit pro URL adresy odpovídající Regexu s mod_rewrite

Pokud chcete, aby Apache odpovídal URL adresám, kde neexistují žádné skutečné adresáře (případ s WordPressem a docela permalinks), pak musíte mít nějaký způsob, jak Apache říct, jak s URL zacházet jinak. A to je přesně to, co mod_rewrite bylo navrženo tak, aby umožňovalo; dává správcům serveru možnost nastavit pravidla pro přiřazování adres URL pomocí regulárních výrazů. Tato pravidla směrují výsledek na jiné adresy URL, často včetně skutečně .PHP souborů a někdy s parametry URL. Pravidla nakonec určují, že se načtou skutečné soubory.

A mod_rewrite je nakonfigurováno s .htaccess nebo httpd.conf

Chcete-li konfigurovat mod_rewrite, můžete to provést pouze v souboru .htaccess nebo v souboru httpd.conf nebo v jednom ze souborů, které obsahuje, jako například httpd-vhosts.conf. Vlastně jsem překvapen, když má klient schopnosti ovládat Apache, že to už nevědí.

WordPress vždy používá stejný jednoduchý .htaccess soubor

Přechod na to, co dělá WordPress, když nastavíte permalinks WordPress zapíše následující soubor do souboru .htaccess za předpokladu, že je zapisovatelný (a v tomto prvním příkladu za předpokladu, že vaše webové stránky jsou obsluhovány z kořenového adresáře):

# 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

Upozornění: Když váš WordPress Front Page Directory není Root

Pokud jsou vaše stránky místo toho obsluhovány z /blog, pak soubor .htaccess bude vypadat takto:

<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 Routes Všechny URL, které neodpovídají souborům/adresářům, do index.php

Takže jak vidíte, jediná věc, kterou WordPress používá, je .htaccess pro mapovánílibovolnéURL do domény do /index.phpnebo /blog/index.php ve 2. příkladu)kroměkdyž URL odpovídá aktuálnímu souboru (například .jpg/.gif/.png obrázek, .css stylesheet, skript .js atd.) nebo když se shoduje se skutečným adresářem (který, pokud vím, je není relevantní ve standardní instalaci WordPress.)

V PHP WordPress Parses $_SERVER['REQUEST_URI'] Rozhodněte co načíst

Uvnitř jeho PHP kódu WordPress chytí hodnotu $_SERVER['REQUEST_URI'], která obsahuje celý požadavek na URL sans doménu a schéma (tj. Schéma je http nebo https) a pak analyzuje hodnotu, aby určila, jaká URL byla požadována, a tedy co stránky, které má načíst.

Vynechání .htaccess? Získat Apache načíst virtuální adresy URL (ale hodně štěstí s tím!)

Pokud tedy chcete nějakým způsobem obejít .htaccess, vaše práce by spočívala v tom, aby Apache reagoval na libovolnou adresu URL a pak načíst WordPress a nastavte $_SERVER['REQUEST_URI'] na cestu URL plus parametry; IOW spoofing to ale v dobré cestě. To znamená, že vím, jestli neví o žádných způsobech, které by nebyly příliš složité.

Vložení /index.php/ (Možná?!?)

Ačkoliv * Chris_O * je správné o tom, jak předat /index.php/ na vaše adresy URL, vždycky to vidím. To přidává 10 znaků na každou adresu URL, což je déle a méně smysluplné pro vyhledávače, ale mnohem horší z nich je méně sdílet a vypadá tajemně pro uživatele. Je nám líto Chris Vím, že jste myslel dobře, ale ugh!

Vytvořit skutečné adresáře pro každou adresu URL (možná?)

Jeden způsob, jak se dostat docela permalinks bez dotyku Apache by bylo napsat skript, který by generoval skutečný adresář pro každou URL, které chcete, a pak uložit index.php tam, že by načíst WordPress. Samozřejmě, že by to bylo obrovské úsilí pro malou výhodu a to by vyžadovalo, aby server měl přístup pro zápis, který musí být horší než použití souboru .htaccess.

Nesnáším se přiznat, ale to je to, co jsem udělal circa 1998 s .ASP-založené webové stránky, když IIS nepodporuje přepisování URL (a dokonce i dnes je to stále skutečný PITA!) Bylo to ošklivé hack, byla bolest udržet a já nenáviděl to, ale URL jistě byly skvělé pro uživatele i pro SEO!

Nejlepší řešení? Přidat pravidla pro přepsání do souboru httpd.conf

Zpět na to, co je pravděpodobně vaše nejlepší řešení, a @Simon Brownto vlastně doporučilo; přidejte svá pravidla pro přepsání do souboru httpd.conf nebo do jednoho ze souborů zahrnutí, jako je httpd-vhosts.conf (což je způsob, jakým je Apache nakonfigurován na serveru localhost na mém počítači Mac.) Přidejte následující směrnici a ujistěte se, že jste změnili adresář tak, aby odpovídal adresáři webu:

<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! S uzamčením přichází výkon příliš

Tato poslední volba by měla odstranit všechny .htaccess a dát kontrolu zpět do jejich rukou. Ještě lépe je to o něco výkonnější, protože httpd.conf je načten pouze jednou, když Apache začíná, ale.htaccess soubory jsou načítány a analyzovány na každém požadavku na URL!

P.S. Ještě jedna věc, kterou je třeba zvážit, by bylo front-end Apache se serverem pro ukládání do mezipaměti jako _ (Nginxkterý se podle mého názoru stává nejlepší praxe pro stránky s vysokým provozem WordPress které opravdu potřebují) To by mohlo mít zelené ladění, protože si nemyslím, že většina lidí používá Nginx k přepisování URL pro Apache, ale pokud to směr zájmu vás zde jsou některé odkazy na sledování:

15
MikeSchinkel

Permalinks bez mod_rewrite

Bez souboru .htaccess nebo úpravou souboru httpd.conf je nejlepší, když můžete soubor pathinfo permalinks. Pathinfo permalinks jsou stejné jako pěkné permalinks kromě toho, že začínají s index.php.

Chcete-li použít perminfo, použijte index.php/na začátku vlastní struktury permalink:

/index.php/%postname%/

Další informace naleznete v článku { Codex article .

2
Chris_O

Zpět na špatné staré dny, WordPress potřeboval napsat nový konfigurační soubor při každé změně struktury permalink. V moderním nastavení se pravidla RewriteRules nemění:

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

Všechny požadavky na neexistující soubory (tj. Vlastní permalinková cesta, která neodpovídá souboru na souborovém systému) jsou předávány prostřednictvím index.php a $_SERVER['REQUEST_URI'] říká PHP co bylo skutečně požadováno. Váš klient může nastavit pravidla pro přepsání v souboru httpd.conf nebo .htaccess a nebudete je muset upravovat, když budete vylepšovat strukturu permalink.

Některé pluginy se pokoušejí upravit .htaccess sami nebo vás požádají o úpravu souboru. Toto řešení nemusí být pro každého, ale stojí za to zvážit.

0
Annika Backstrom