Bagaimana cara menghapus .html dari URL?

112

Bagaimana cara menghapus .htmldari URL halaman statis?

Selain itu, saya perlu mengalihkan url apa pun dengan .htmlyang tanpa itu. (yaitu www.example.com/page.htmlke www.example.com/page).

Dave
sumber
1
Yang Anda maksud dengan "hapus .html" adalah "tidak perlu .html ada"?
Balapan Ringan di Orbit
@Tomalak: Ya dan juga mengarahkan url dengan ".html" ke yang tidak. Masalah saya adalah ini menghasilkan pengalihan tak terbatas. Penyiapan saya saat ini memungkinkan www.example.com/page.html dan www.example.com/page dapat diakses dan tidak ramah SEO.
Dave
@Tomalak: Terima kasih atas tipnya. Membaca dokumentasi mod_rewrite sangat membantu.
Dave

Jawaban:

105

Saya pikir beberapa penjelasan dari jawaban Jon akan konstruktif. Pengikut:

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

memeriksa bahwa jika file atau direktori yang ditentukan tidak ada, maka aturan penulisan ulang dilanjutkan:

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

Tapi apa maksudnya itu? Ini menggunakan regex (ekspresi reguler) . Ini adalah sesuatu yang saya buat sebelumnya ... masukkan deskripsi gambar di sini

Saya pikir itu benar.

CATATAN: Saat menguji, .htaccess jangan gunakan pengalihan 301. Gunakan 302 hingga pengujian selesai, karena browser akan menyimpan 301 cache. Lihat https://stackoverflow.com/a/9204355/3217306

Pembaruan: Saya sedikit salah, .mencocokkan semua karakter kecuali baris baru, jadi termasuk spasi. Juga, berikut adalah lembar contekan regex yang bermanfaat

Sumber:

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

binaryfunt.dll
sumber
6
Diagram luar biasa untuk membantu menjelaskan jawabannya.
Ric
Tip tentang 301 dan cache browser inilah yang memecahkan masalah saya.
bgfvdu3w
@KnocksX Saya bukan lagi seorang webmaster dan saya tidak dalam posisi untuk dapat membantu
binaryfunt
84

Untuk menghapus ekstensi .html dari url Anda, Anda dapat menggunakan kode berikut di 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]

CATATAN: Jika Anda ingin menghapus ekstensi lain, misalnya untuk menghapus ekstensi .php, cukup ganti html di mana saja dengan php pada kode di atas.

Amit Verma
sumber
10
Tidak ada jawaban lain yang berhasil untuk saya, tetapi yang ini berhasil, terima kasih banyak!
Emmet Arries
2
yang satu ini juga berhasil untuk saya. Terima kasih @arkeen. Punya suara ^.
JeremyS
2
Bekerja dengan baik. Terima kasih!
ixany
yang satu ini menghapus ekstensi file untuk saya tetapi tidak mengarahkan ke halaman itu
Bhargav Venkatesh
74

Dengan .htaccess di bawah apache, Anda dapat melakukan pengalihan seperti ini:

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

Untuk menghapus .html dari url, cukup tautkan ke halaman tanpa .html

<a href="http://www.example.com/page">page</a>
Jon Skarpeteig
sumber
23
Ini tidak melakukan apa-apa untukku. Apakah ada alasan mengapa itu tidak berhasil?
Michael Yaworski
Apakah Anda memiliki file sebenarnya untuk tautan yang diminta? Itu akan memicu!-f
Martijn
72

Ini seharusnya berhasil untuk Anda:

#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]
Łukasz Habrzyk
sumber
3
Saya mendapatkan 404 di GoDaddy dengan kode ini dan saya memperbaikinya dengan meletakkan: Opsi + FollowSymLinks -MultiViews -Indexes di bagian paling atas.
Labanino
1
Menurut saya inilah jawaban terbaik dan terlengkap, terima kasih!
ctekk
Saya mencoba melakukan ini di localhost, tetapi tidak berhasil, apakah ada hal lain yang perlu saya lakukan, apakah saya harus menautkan file .htaccess, atau bagaimana halaman mengenalinya?
Pianistprogrammer
Bagaimana cara menambahkan ekstensi .php ke # 301 dari example.com/page.html ke example.com/page, apakah mungkin?
20

Anda perlu memastikan bahwa Anda juga memilikinya Options -MultiViews.

Semua hal di atas tidak berfungsi untuk saya pada host cPanel standar.

Ini berhasil:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
Banjir Bradley
sumber
Dari semua jawaban di atas yang satu ini akhirnya berhasil .. Saya percaya karena situs saya di-host di GoDaddy dengan cPanel. Kuncinya adalah Opsi -MultiViews
Brad Vanderbush
Ya, tidak ada di bagian ini yang berhasil mengharapkan jawaban ini! Anda menyelamatkan hari itu!
Neil Bannet
Terima kasih sobat. Saya tidak yakin mengapa yang lain tidak bekerja seperti yang diharapkan.
Nanoo
13

Terima kasih atas balasan Anda. Saya sudah memecahkan masalah saya. Misalkan saya memiliki halaman saya di bawah http://www.yoursite.com/html , aturan .htaccess berikut berlaku.

<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>
Dave
sumber
6

Saya menggunakan .htacess ini untuk menghapus ekstensi .html dari situs url saya, harap verifikasi bahwa ini adalah kode yang benar:

    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]
Anmol
sumber
Ini sepertinya berhasil untuk saya, tidak seperti solusi lain yang disajikan di sini, terima kasih. Saya akan menambahkan bahwa Anda masih perlu memperbarui tautan di HTML Anda (jadi jika Anda awalnya menautkan ke file .html Anda sebagai <a href="page1.html"> </a>, Anda harus memperbarui sebagai <a href=" example.com/page1"> </ a > lalu akan berfungsi.)
Lorenzo
Perubahan inti bagi saya adalah RewriteBase /sedikit. Sayangnya saya tidak mengerti mengapa itu berhasil, tapi saya rasa saya akan segera belajar.
Keno Clayton
4

Bagi mereka yang menggunakan Firebase hosting, tidak ada jawaban yang akan berfungsi di halaman ini. Karena Anda tidak dapat menggunakan .htaccessdi Firebase hosting. Anda harus mengonfigurasi file firebase.json. Cukup tambahkan baris "cleanUrls": truedi file Anda dan simpan. Itu dia.

Setelah menambahkan baris firebase.json akan terlihat seperti ini:

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

Untuk menghapus ekstensi .html dari URL Anda, Anda dapat menggunakan kode berikut di 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]

Terima kasih

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

Coba ini :) tidak tahu apakah itu berhasil.

Jarsäter
sumber
4
Anda tidak boleh mempostingnya sebagai jawaban jika Anda tidak yakin apakah itu berfungsi atau tidak.
Apakah itu penting