Come rimuovere .html da URL?


112

Come rimuovere .htmldall'URL di una pagina statica?

Inoltre, devo reindirizzare qualsiasi URL con .htmla quello senza di esso. (cioè www.example.com/page.htmla www.example.com/page).


1
Con "rimuovi .html", intendi "non richiedere la presenza di .html"?
Gare di leggerezza in orbita

@Tomalak: Sì e reindirizza anche gli URL con ".html" a quelli senza. Il mio problema è che questo si traduce in un reindirizzamento infinito. La mia configurazione attuale consente a www.example.com/page.html e www.example.com/page di essere entrambi accessibili, il che non è SEO friendly.
Dave


@ Tomalak: grazie per i suggerimenti. La lettura della documentazione di mod_rewrite è stata molto utile.
Dave

Risposte:


105

Penso che una spiegazione della risposta di Jon sarebbe costruttiva. Il seguente:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

controlla che se il file o la directory specificati rispettivamente non esiste, la regola di riscrittura procede:

RewriteRule ^(.*)\.html$ /$1 [L,R=301]

Ma cosa significa? Usa regex (espressioni regolari) . Ecco qualcosa che ho fatto prima ... inserisci qui la descrizione dell'immagine

Io penso che sia corretto.

NOTA: durante il test .htaccess non utilizzare reindirizzamenti 301. Usa 302 fino al termine del test, poiché il browser memorizzerà i 301 nella cache. Vedi https://stackoverflow.com/a/9204355/3217306

Aggiornamento: mi sbagliavo leggermente, .corrisponde a tutti i caratteri tranne i caratteri di nuova riga, quindi include gli spazi. Inoltre, ecco un utile cheat regex

fonti:

http://community.sitepoint.com/t/what-does-this-mean-rewritecond-request-filename-fd/2034/2

https://mediatemple.net/community/products/dv/204643270/using-htaccess-rewrite-rules


6
Superbo diagramma per aiutare a spiegare la risposta.
Ric

Il suggerimento sui 301 e sulla cache del browser è ciò che ha risolto i miei problemi.
bgfvdu3w

@KnocksX Non sono più un webmaster e non sono nella posizione di poter aiutare
binaryfunt

84

Per rimuovere l'estensione .html dai tuoi URL, puoi utilizzare il seguente codice in root / htaccess:

RewriteEngine on


RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]

NOTA: Se vuoi rimuovere qualsiasi altra estensione, ad esempio per rimuovere l'estensione .php, sostituisci semplicemente html ovunque con php nel codice sopra.


10
Nessuna delle altre risposte ha funzionato per me, ma questa ha funzionato, grazie mille!
Emmet Arries

2
anche questo ha funzionato per me. Grazie @starkeen. Avere un ^ voto.
JeremyS

2
Ha funzionato perfettamente. Grazie!
ixany

questo rimuove l'estensione del file per me ma non reindirizza a quella pagina
Bhargav Venkatesh

74

Con .htaccess sotto apache puoi fare il reindirizzamento in questo modo:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301] 

Per quanto riguarda la rimozione di .html dall'URL, è sufficiente collegarsi alla pagina senza .html

<a href="http://www.example.com/page">page</a>

23
Questo non fa niente per me. C'è qualche motivo per cui non funzionerebbe?
Michael Yaworski

Hai un file effettivo per il collegamento richiesto? Ciò attiverebbe il!-f
Martijn

72

Questo dovrebbe funzionare per te:

#example.com/page will display the contents of example.com/page.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

#301 from example.com/page.html to example.com/page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/
RewriteRule ^(.*)\.html$ /$1 [R=301,L]

3
Stavo ottenendo un 404 in Godaddy con questo codice e l'ho risolto inserendo: Opzioni + FollowSymLinks -MultiViews -Indexes in alto.
Labanino

1
Penso che questa sia la risposta migliore e più completa, grazie!
ctekk

Ho provato a farlo in localhost, ma non funziona, c'è qualcos'altro che devo fare, devo collegare il file .htaccess o come lo riconosce la pagina?
Pianistprogrammer

Come posso aggiungere l'estensione .php a # 301 da example.com/page.html a example.com/page, è possibile?

20

Dovrai assicurarti di averlo anche tu Options -MultiViews.

Nessuno dei precedenti ha funzionato per me su un host cPanel standard.

Questo ha funzionato:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Tra tutte le risposte sopra, questa ha finalmente funzionato .. Credo perché il mio sito è ospitato su Godaddy con cPanel. La chiave è Opzioni -MultiViews
Brad Vanderbush

Sì, niente in questa sezione funziona aspettatevi questa risposta! Hai salvato la giornata!
Neil Bannet

Grazie compagno. Non sono sicuro del motivo per cui gli altri non hanno funzionato come previsto.
Nanoo

13

Grazie per le tue risposte. Ho già risolto il mio problema. Supponiamo che le mie pagine siano all'indirizzo http://www.iltuosito.com/html , si applicano le seguenti regole .htaccess .

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*).html\ HTTP/
   RewriteRule .* http://localhost/html/%1 [R=301,L]

   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*)\ HTTP/
   RewriteRule .* %1.html [L]
</IfModule>

6

Uso questo .htacess per rimuovere .html extantion dal mio sito URL, verifica che sia il codice corretto:

    RewriteEngine on
RewriteBase /
RewriteCond %{http://www.proofers.co.uk/new} !(\.[^./]+)$
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule (.*) /$1.html [L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP
RewriteRule ^([^.]+)\.html$ http://www.proofers.co.uk/new/$1 [R=301,L]

Questo sembrava funzionare per me, a differenza delle altre soluzioni presentate qui, grazie. Vorrei aggiungere però che devi ancora aggiornare i link nel tuo HTML (quindi se originariamente ti stai collegando al tuo file .html come <a href="page1.html"> </a>, dovresti aggiornare come <a href=" example.com/page1"> </ a > e quindi funzionerà.)
Lorenzo

Il cambiamento fondamentale per me è stato il RewriteBase /bit. Sfortunatamente non capisco perché abbia funzionato, ma immagino che imparerò presto.
Keno Clayton

4

Per coloro che utilizzano l'hosting Firebase nessuna delle risposte funzionerà in questa pagina. Perché non puoi utilizzarlo .htaccessnell'hosting Firebase. Dovrai configurare il file firebase.json. Basta aggiungere la riga "cleanUrls": truenel file e salvarlo. Questo è tutto.

Dopo aver aggiunto la riga firebase.json avrà questo aspetto:

{
  "hosting": {
    "public": "public",
    "cleanUrls": true, 
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

2

Per rimuovere l'estensione .html dai tuoi URL, puoi utilizzare il seguente codice in root / htaccess:

#mode_rerwrite start here

RewriteEngine On

# does not apply to existing directores, meaning that if the folder exists on server then don't change anything and don't run the rule.

RewriteCond %{REQUEST_FILENAME} !-d

#Check for file in directory with .html extension 

RewriteCond %{REQUEST_FILENAME}\.html !-f

#Here we actually show the page that has .html extension

RewriteRule ^(.*)$ $1.html [NC,L]

Grazie


-1
RewriteRule /(.+)(\.html)$ /$1 [R=301,L] 

Prova questo :) non so se funziona.


4
Non dovresti pubblicarlo come risposta se non sei sicuro che funzioni o meno.
Ha importanza
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.