Bagaimana cara menerapkan penulisan ulang URL dalam file .htaccess saya?

17

Saya ingin melakukan penulisan ulang URL (Mengapa? Lihat pertanyaan ini .) Sehingga alih-alih pengguna yang melihat alamat suka

labouseur.com/course-compilers.html 

mereka malah bisa melihat dan menggunakan secara sederhana

labouseur.com/course-compilers

(Bahkan lebih baik, mungkin saya harus merestrukturisasi itu sehingga kursus / kompiler.)

Saya menggunakan layanan hosting bersama berbasis Linux untuk situs web saya, jadi saya tidak memiliki kontrol administratif server, tetapi saya memiliki kontrol atas .htaccess. Referensi yang saya baca online tampak kurang jelas bagi saya, jadi saya mencari sedikit kejelasan dan saran di sini.

Alan
sumber
Perhatikan bahwa ini bukan sesuatu yang hanya Anda lakukan di konfigurasi server (.htaccess). Langkah pertama yang penting adalah benar-benar mengubah URL dalam aplikasi Anda, jika tidak, Anda akan berakhir dengan banyak pengalihan yang tidak perlu (atau duplikat konten).
MrWhite

Jawaban:

13

Anda sebenarnya dapat menghapus .html dari file di server Anda dan mengatur pengaturan di htaccess sehingga mereka dapat disajikan sebagai file html, tetapi itu mungkin bukan yang Anda cari.

Melakukan hal ini :

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
Rizwan Kassim
sumber
Ada lebih banyak kerumitan di sini, terutama jika Anda khawatir tentang masalah duplikat konten. Dengan aturan di atas, halaman Anda akan tetap dapat diakses dari URL lama.
JasonBirch
3

Pertama, pastikan apache memiliki modul dan diizinkan di file .htacces, lalu tambahkan:

RewriteEngine on

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

Contoh Anda akan membutuhkan

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

Untuk struktur direktori satu tingkat dan

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

Untuk struktur multi-level.

Tapi hati-hati

Jika Anda memiliki struktur

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

Aturan penulisan ulang dalam .htaccessfile anak akan relatif terhadap folder induknya dan Anda dapat masuk ke beberapa situasi loop penulisan ulang yang berantakan . Pastikan Anda menggunakan RewriteConduntuk menghentikannya jika Anda bisa!

Aiden Bell
sumber
Apakah Anda keberatan merinci lebih lanjut tentang poin terakhir (menggunakan RewriteCond untuk menghentikan loop)?
Travis Northcutt
2

Sebagai tambahan untuk jawaban di atas, seseorang dapat menggunakan

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

([\w-]+) Mengizinkan huruf, digit dengan tanda hubung (-).

(.*) akan menulis ulang setiap permintaan, yang dapat mengabaikan aturan berikut lainnya yang menyebabkan kesalahan server internal dalam mengakses.

Abhishek Gurjar
sumber
RewriteRule Pola Anda merupakan peningkatan dari jawaban yang diterima untuk contoh spesifik yang diberikan dalam pertanyaan, namun, akan gagal untuk mencocokkan kasus yang lebih umum ketika ada lebih dari satu segmen jalan, misalnya. /path/to/course-compilers. Sertakan Lbendera untuk mengurangi dampak pada aturan berikut. Walaupun (.*)polanya tidak umum, tidak mungkin menyebabkan masalah serius, karena kondisi yang memeriksa file ada.
MrWhite
1

Anda tidak harus menggunakan file .htaccess untuk melakukannya. Cukup susun file Anda ke direktori, dan alih-alih menggunakan "labouseur.com/course-compilers.html", cukup beri nama file index.html dan masukkan ke dalam direktori yang disebut "course-compiler". Kemudian ketika Anda menunjuk ke direktori itu, indeks disajikan secara default tetapi tidak akan ditampilkan di URL. Jadi Anda bisa menulis tautan Anda sebagai "labourseur.com/course-compiler" dan semuanya akan baik-baik saja.

Tidak diperlukan .htaccess.

Joel Glovier
sumber