Apache mod_rewrite
Yang Anda cari adalah mod_rewrite ,
Deskripsi: Menyediakan mesin penulisan ulang berbasis aturan untuk menulis ulang URL yang diminta dengan cepat.
Secara umum, mod_rewrite
bekerja dengan mencocokkan dokumen yang diminta dengan ekspresi reguler yang ditentukan, kemudian melakukan penulisan ulang URL secara internal (dalam proses apache) atau secara eksternal (di browser klien). Penulisan ulang ini bisa sesederhana menerjemahkan example.com/foo secara internal menjadi permintaan misalnya example.com/foo/bar.
Dokumen Apache menyertakan mod_rewrite
panduan dan saya pikir beberapa hal yang ingin Anda lakukan tercakup di dalamnya. Panduan mod_rewrite terperinci .
Paksa www
subdomain
Saya ingin memaksakan "www" sebelum setiap url, jadi bukan domain.com tetapi www.domain.com/page
Panduan penulisan ulang menyertakan instruksi untuk ini di bawah contoh Canonical Hostname .
Hapus garis miring (Bagian 1)
Saya ingin menghapus semua garis miring dari halaman
Saya tidak yakin mengapa Anda ingin melakukan ini karena panduan penulisan ulang menyertakan contoh untuk kebalikannya , yaitu, selalu menyertakan garis miring. Dokumen menyarankan bahwa menghapus garis miring memiliki potensi besar untuk menyebabkan masalah:
Trailing Slash Problem
Deskripsi:
Setiap webmaster dapat menyanyikan sebuah lagu tentang masalah garis miring pada URL yang mereferensikan direktori. Jika mereka yang hilang, server kesedihan kesalahan, karena jika Anda mengatakan /~quux/foo
bukan /~quux/foo/
maka pencarian server untuk sebuah file bernama foo. Dan karena file ini adalah direktori yang dikeluhkan. Sebenarnya ini mencoba untuk memperbaikinya sendiri di sebagian besar kasus, tetapi terkadang mekanisme ini perlu ditiru oleh Anda. Misalnya setelah Anda melakukan banyak penulisan ulang URL yang rumit ke skrip CGI dll.
Mungkin Anda bisa menjelaskan mengapa Anda ingin menghapus garis miring sepanjang waktu?
Hapus .php
ekstensi
Saya membutuhkannya untuk menghapus .php
Hal terdekat untuk melakukan ini yang dapat saya pikirkan adalah menulis ulang secara internal setiap dokumen permintaan dengan ekstensi .php, yaitu, example.com/somepage malah diproses sebagai permintaan untuk example.com/somepage.php. Perhatikan bahwa melanjutkan dengan cara ini akan mengharuskan setiap somepage benar-benar ada sebagai somepage.php pada sistem berkas.
Dengan kombinasi yang tepat dari persamaan reguler, hal ini harus dimungkinkan sampai batas tertentu. Namun, saya dapat meramalkan beberapa kemungkinan masalah dengan halaman indeks yang tidak diminta dengan benar dan direktori yang tidak cocok dengan benar.
Misalnya, ini akan menulis ulang example.com/test dengan benar sebagai permintaan untuk example.com/test.php:
RewriteEngine on
RewriteRule ^(.*)$ $1.php
Namun akan membuat example.com gagal dimuat karena tidak ada example.com/.php
Saya akan menebak bahwa jika Anda menghapus semua garis miring, kemudian memilih permintaan indeks direktori dari permintaan nama file di direktori induk akan menjadi hampir tidak mungkin. Bagaimana Anda menentukan permintaan untuk direktori 'foobar':
example.com/foobar
dari permintaan file bernama foobar (yang sebenarnya foobar.php)
example.com/foobar
Mungkin saja jika Anda menggunakan RewriteBase
arahan. Tetapi jika Anda melakukannya maka masalah ini menjadi jauh lebih rumit karena Anda akan memerlukan RewriteCond
arahan untuk melakukan pemeriksaan tingkat sistem file jika permintaan dipetakan ke direktori atau file.
Yang mengatakan, jika Anda menghapus persyaratan untuk menghapus semua garis miring yang membuntuti dan sebaliknya menambahkan garis miring secara paksa, masalah "tanpa ekstensi .php" menjadi sedikit lebih masuk akal.
# Turn on the rewrite engine
RewriteEngine on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]
Ini masih belum sempurna - setiap permintaan untuk file masih memiliki .php yang ditambahkan ke permintaan secara internal. Permintaan untuk 'hi.txt' akan memasukkan ini ke dalam log kesalahan Anda:
[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat
Tetapi ada opsi lain, atur DefaultType
dan DirectoryIndex
arahan seperti ini:
DefaultType application/x-httpd-php
DirectoryIndex index.php index.html
Perbarui 2013-11-14 - Memperbaiki potongan di atas untuk memasukkan pengamatan nicorellius
Sekarang permintaan untuk hi.txt (dan yang lainnya) berhasil, permintaan ke example.com/test akan mengembalikan versi test.php yang telah diproses, dan file index.php akan berfungsi kembali.
Saya harus memberikan kredit di mana kredit jatuh tempo untuk solusi ini karena saya menemukannya di Blog Michael J. Radwins dengan mencari di Google untuk php tanpa ekstensi apache .
Hapus garis miring
Beberapa pencarian apache remove trailing slashes
membawa saya ke beberapa halaman Search Engine Optimization. Rupanya beberapa Sistem Manajemen Konten (Drupal dalam hal ini) akan membuat konten tersedia dengan dan tanpa garis miring di URls, yang dalam dunia SEO akan menyebabkan situs Anda dikenai penalti konten duplikat. Sumber
Solusinya tampaknya cukup sepele, menggunakan mod_rewrite
we rewrite dengan syarat sumber daya yang diminta diakhiri dengan a /
dan menulis ulang URL dengan mengirimkan kembali 301 Permanent Redirect
header HTTP.
Berikut contohnya yang mengasumsikan domain Anda adalah blamcast.net dan memungkinkan permintaan untuk diawali dengan opsional www.
.
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Sekarang kita menuju ke suatu tempat. Mari kita gabungkan semuanya dan lihat seperti apa tampilannya.
Wajib www.
, tidak .php
, dan tidak ada garis miring
Ini mengasumsikan domainnya adalah foobar.com dan berjalan pada port standar 80.
# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html
# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST} !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*) http://www.foobar.com/$1 [L,R,NE]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Bendera 'R' dijelaskan di bagian RewriteRule
direktif. Potongan:
redirect|R [=code]
(force redirect) Prefix Substitution with
http://thishost[:thisport]/
(yang membuat URL baru menjadi URI) untuk memaksa pengalihan eksternal. Jika tidak ada kode yang diberikan, respons HTTP 302 ( MOVED TEMPORARILY ) akan dikembalikan.
Catatan Akhir
Saya tidak bisa berhasil menghapus garis miring. Pengalihan akhirnya memberi saya pengulangan pengalihan tak terbatas. Setelah membaca solusi asli lebih dekat, saya mendapat kesan bahwa contoh di atas berfungsi untuk mereka karena cara instalasi Drupal mereka dikonfigurasi. Dia menyebutkan secara spesifik:
Di situs Drupal biasa, dengan mengaktifkan URL bersih, kedua alamat ini pada dasarnya dapat dipertukarkan
Mengacu pada URL yang diakhiri dengan dan tanpa garis miring. Selanjutnya,
Drupal menggunakan file yang dipanggil .htaccess
untuk memberi tahu server web Anda bagaimana menangani URL. Ini adalah file yang sama yang memungkinkan keajaiban URL bersih Drupal. Dengan menambahkan perintah pengalihan sederhana ke awal
.htaccess
file Anda, Anda dapat memaksa server untuk secara otomatis menghapus garis miring yang tertinggal.