Come posso implementare la riscrittura degli URL nel mio file .htaccess?


17

Mi piacerebbe fare un po 'di riscrittura degli URL (Perché? Vedi questa domanda .) In modo che invece gli utenti vedano indirizzi simili

labouseur.com/course-compilers.html 

possono invece vedere e usare semplicemente

labouseur.com/course-compilers

(Ancora meglio, forse dovrei ristrutturarlo in modo che si tratti di corsi / compilatori.)

Sto usando un servizio di hosting condiviso basato su Linux per il mio sito Web, quindi non ho il controllo amministrativo del server, ma ho il controllo su .htaccess. I riferimenti che ho letto online mi sono sembrati poco chiari, quindi sto cercando un po 'di chiarezza e consigli qui.


Nota che questo non è qualcosa che fai solo nella configurazione del server (.htaccess). Il primo importante passo è cambiare effettivamente gli URL nella tua applicazione, altrimenti finirai con molti reindirizzamenti (o contenuti duplicati) non necessari.
MrWhite il

Risposte:


13

Potresti effettivamente rimuovere .html dai file sul tuo server e configurare le impostazioni in htaccess in modo che vengano servite come file html, ma probabilmente non è quello che stai cercando.

Fai questo :

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ $1.html

Qui c'è più complessità, specialmente se sei preoccupato per problemi di contenuto duplicato. Con la regola sopra, le tue pagine saranno comunque accessibili dai vecchi URL.
JasonBirch,

3

Innanzitutto, assicurati che apache abbia il modulo e che sia consentito nei file .htacces, quindi aggiungi:

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/$1 

Il tuo esempio richiederebbe

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /$1.html

Per una struttura di directory a livello singolo e

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /$1.html

Per una struttura multilivello.

Ma stai attento

Se hai la struttura

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess

Le regole di riscrittura nel bambino .htaccessfile saranno relativi alla loro cartella principale e si può ottenere in qualche disordinato situazioni di loop riscrittura. Assicurati di usarlo RewriteCondper impedire che accadano, se puoi!


Ti dispiace andare più in dettaglio su quell'ultimo punto (usando RewriteCond per fermare i loop)?
Travis Northcutt,

2

Oltre alle risposte sopra si possono usare

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ $1.html [L]

([\w-]+) Consente lettere, cifre con un trattino (-).

(.*) riscriverà ogni richiesta a prescindere, il che potrebbe impotente altre seguenti regole causando errori interni al server durante l'accesso.


Il tuo RewriteRule modello è un miglioramento rispetto alla risposta accettata per l'esempio specifico fornito nella domanda, tuttavia, non riuscirà a corrispondere al caso più generale quando esiste più di un segmento di percorso, ad es. /path/to/course-compilers. Includi il Lflag per ridurre l'impatto sulle seguenti regole. Sebbene il (.*)modello sia inutilmente generale, è improbabile che causi seri problemi, a causa della condizione che controlla il file.
MrWhite,

1

Non è necessario utilizzare un file .htaccess per ottenere questo risultato. Basta strutturare i file in directory e invece di utilizzare "labouseur.com/course-compilers.html", basta nominare il file index.html e inserirlo in una directory chiamata "course-compilers". Quindi, quando si punta a quella directory, l'indice viene offerto per impostazione predefinita ma non verrà visualizzato nell'URL. Quindi potresti semplicemente scrivere i tuoi link come "labourseur.com/course-compilers" e tutto andrà bene.

Nessun accesso richiesto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.