Domanda

Ho un cliente che preferisce fortemente al file .htaccess disabilitare perché a loro piace impostare le configurazioni di Apache stessi. Tuttavia, vogliono ancora gli URL SEO-friendly.

C'è un modo per avere permalink personalizzati senza file .htaccess? La mia ricerca finora sembra indicare questo non è possibile, ma forse uno degli sviluppatori brillanti sa come l'apparentemente impossibile può essere possibile. Grazie in anticipo!

È stato utile?

Soluzione

Ciao @ Mike Lee :

Per rispondere alla tua domanda è utile per capire come funziona il tutto.

Apache Serve URL che corrispondono file e directory

Apache è stato progettato per servire i file in modo esplicito appaiati per URL, o per servire il index.php trovato in una directory quando la directory è esplicitamente abbinato.

Ma Apache può servire URL accompagnata da Regex con mod_rewrite

Se si desidera Apache per abbinare gli URL per cui non ci sono veri e propri indici (il caso con WordPress e graziose permalinks) allora è necessario avere un modo per dire ad Apache come gestire gli URL in modo diverso. E questo è esattamente ciò che mod_rewrite è stato progettato per consentire; dà amministratori di server la possibilità di impostare regole per gli URL utilizzando le espressioni regolari. Coloro percorso regole il risultato ad altri URL, spesso anche i file in realtà .PHP e, talvolta, con i parametri URL passato. In definitiva le regole specificano che i file effettivi vengono caricati.

E mod_rewrite è configurato con entrambi i .htaccess o httpd.conf

Per configurare mod_rewrite si può fare solo all'interno .htaccess o all'interno del file httpd.conf o uno dei file che include, come potenzialmente httpd-vhosts.conf. In realtà Sono sorpreso se si cliente ha le competenze per controllare Apache che non lo sanno già.

WordPress sempre utilizza lo stesso file .htaccess semplice

Passando a ciò che fa WordPress, quando si imposta permalink WordPress scrive quanto segue al file .htaccess, ammesso che sia scrivibile ( e in questo primo esempio supponendo che il vostro sito web è servita dalla radice ) :

# 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

Avvertimento: quando il vostro WordPress Front Page Directory è Non Root

Se il sito è invece servita da /blog , allora il file .htaccess scritta sarebbe simile a questa:

<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 percorsi tutti i non-File / URL corrispondenti Directory per index.php

Quindi, come si può vedere, l'unica cosa che usi WordPress .htaccess per è quello di mappare qualsiasi URL del dominio /index.php (o /blog/index.php nel 2 ° esempio) tranne quando un URL corrisponde a un file vero e proprio (come ad esempio un / .jpg immagine .gif / .png, un foglio di stile .css, uno script .js, etc.) o quando si corrisponde a una directory vera ( che per quanto ne so non è rilevante in una installazione standard di WordPress.)

In PHP WordPress Analizza $_SERVER['REQUEST_URI'] per decidere il da caricare

All'interno della sua WordPress codice PHP afferra il valore di $_SERVER['REQUEST_URI'] che contiene la richiesta URL completo sans il dominio e lo schema (cioè regime è http o https) e poi analizza il valore per determinare quale fosse URL richiesto e quindi quali pagine si deve caricare.

Esclusione .htaccess? Ottenere Apache per caricare URL virtuali (ma buona fortuna con quello!)

Quindi, se si vuole in qualche modo bypass .htaccess vostro lavoro sarebbe quella di ottenere Apache per rispondere a un URL arbitrario quindi caricare WordPress e set $_SERVER['REQUEST_URI'] essere il sentiero URL più parametri; IOW spoofing, ma in senso buono. Detto questo, so che se conosco nessun modi che non sono eccessivamente complicato per farlo.

Embedding /index.php/ (forse?!?)

Anche se * * Chris_O è corretta su anteponendo /index.php/ ai tuoi URL I rabbrividire ogni volta che vedo questo. Si aggiunge 10 caratteri per ogni URL che li rende più lunga e meno significativo per i motori di ricerca, ma di gran lunga peggiore li rende meno condivisibili e sembra criptico per gli utenti. Spiacente Chris Lo so che dire bene, ma ugh!

Crea reale directory per ogni URL (forse?)

Un modo per ottenere pretpermalinks ty Senza toccare Apache sarebbe quello di scrivere uno script che genererebbe una directory vera per ogni URL che si desidera e quindi memorizzare un index.php lì che sarebbe caricare WordPress. Naturalmente questo sarebbe enorme sforzo per la piccola beneficio e sarebbe necessario il server di avere accesso in scrittura che deve essere peggio di utilizzare un file .htaccess.

Odio ammetterlo, ma questo è quello che ho fatto circa 1998 con un sito web .ASP-based quando IIS non supportava la riscrittura degli URL (e ancora oggi è ancora un vero e proprio PITA!) E 'stato un brutto hack, è stato un dolore per sostengo e ho odiato, ma gli URL sicuri erano ottimi sia per gli utenti e per SEO!

soluzione migliore? Aggiungere regole di riscrittura httpd.conf

Torna a ciò che è probabilmente la migliore soluzione, e @Simon Brown effettivamente consigliato; aggiungere le regole di riscrittura per httpd.conf o uno dei file include come httpd-vhosts.conf Aggiungere la seguente realizzazione direttiva sicuri di cambiare la directory in modo che corrisponda la directory per il sito (che è come Apache è configurato in localhost sul mio Mac.):

<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! Con Lockdown Viene prestazioni Troppo

Questa ultima opzione dovrebbe eliminare qualsiasi .htaccess e mettere il controllo nelle loro mani. Ancora meglio è leggermente più performante in quanto httpd.conf viene caricato solo una volta quando si avvia Apache ma file .htaccess vengono caricati ed elaborati su ogni richiesta URL!

P.S. Un'altra cosa da considerare potrebbe essere quella di front-end Apache con un server di caching come Nginx che credo sta diventando un best practice per i siti ad alto traffico WordPress che davvero bisogno di essere performante. Si potrebbe prendere campo tweaking verde perché non credo che la maggior parte delle persone hanno utilizzato Nginx per fare la riscrittura degli URL per Apache ma se che gli interessi direzione si Ecco alcuni link da perseguire:

Altri suggerimenti

Permalinks senza mod_rewrite

Senza un file .htaccess o modificare il file httpd.conf il meglio che puoi fare è pathinfo permalink. Pathinfo permalink sono gli stessi piuttosto permalinks tranne che iniziano con index.php.

Per usare pathinfo permalink messo index.php / all'inizio della vostra struttura dei permalink personalizzati:

/index.php/%postname%/

Codex articolo per ulteriori informazioni.

Torna nei vecchi tempi, WordPress aveva bisogno di scrivere un nuovo file di configurazione ogni volta che è stata modificata la struttura dei permalink. In configurazioni moderni, i RewriteRules sono immutabili:

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

Tutte le richieste di file inesistente (vale a dire un percorso. Permalink personalizzato che non corrisponde un file nel file system) viene passato attraverso index.php, e $_SERVER['REQUEST_URI'] dice PHP quanto effettivamente richiesto. Il vostro cliente può impostare le regole di riscrittura in httpd.conf o .htaccess, e non sarà necessario modificare come si ottimizzare la struttura dei permalink.

Alcuni plugin tentano di modificare se stessi .htaccess, o ti chiedono di modificare il file. Questa soluzione non può essere per tutti, ma vale la pena considerare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top