Hapus ekstensi .php dengan .htaccess

101

Ya, saya telah membaca manual Apache dan mencari di sini. Untuk beberapa alasan saya tidak bisa membuat ini bekerja. Hal terdekat yang pernah saya lakukan adalah menghapus ekstensi, tetapi mengarah kembali ke direktori root. Saya ingin ini hanya berfungsi di direktori yang berisi .htaccessfile.

Saya perlu melakukan tiga hal dengan .htaccessfile tersebut.

  1. Saya membutuhkannya untuk menghapus .php

    Sebuah. Saya memiliki beberapa halaman yang menggunakan tab dan URL-nya terlihat seperti page.php # tab - apakah ini mungkin?

    b. Saya memiliki satu halaman yang menggunakan ID sesi yang ditambahkan ke URL untuk memastikan Anda datang dari tempat yang tepat www.domain.com/download-software.php?abcdefg,.

Apakah ini mungkin? Juga dalam melakukan ini, apakah saya perlu menghapus ".php" dari tautan di header saya termasuk file nav? SebaiknyaIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Saya ingin itu memaksa "www" sebelum setiap URL, jadi bukan domain.com, tapi www.domain.com/page.
  2. Saya ingin menghapus semua garis miring dari halaman.

Saya akan terus mencari, mencoba, dll. Apakah berada di sub direktori menyebabkan masalah?

Desain Burung Kotor
sumber
Saya hanya penasaran, apa manfaatnya ini? Apakah ini agar pengguna Anda tidak tahu file apa di server Anda yang mereka akses?
Kolob Canyon
dua kali lipat. sehingga mereka tidak tahu jenis file apa yang kami sajikan, dan IMO terlihat lebih bersih
Dirty Bird Design
Pertanyaan terkait lainnya: stackoverflow.com/questions/6534904/… .
Edward

Jawaban:

121

Jawaban Gumbo dalam pertanyaan Stack Overflow Bagaimana cara menyembunyikan ekstensi .html dengan Apache mod_rewrite seharusnya berfungsi dengan baik.

Re 1) Ubah .html menjadi .php

Re a.) Yup, itu mungkin, tambahkan saja #tabke URL.

Re b.) Itu mungkin menggunakan QSA(Query String Append), lihat di bawah.

Ini juga harus berfungsi di jalur sub-direktori:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
Pekka
sumber
thx for your help man, untuk alasan apa pun, saya bertaruh karena sesi yang ditambahkan url sedang di-hardcode dalam file PHP (cerita panjang) Saya dapat mengaksesnya tanpa di atas. Saya sangat menghargai bantuan Anda, hal .htaccess ini rumit bagi saya.
Dirty Bird Design
8
@Pekka 웃 hapus spasi di antara tanda [L,spasi QSA], jika tidak, 500 Server Internal Error akan terjadi.
Rahil Wazir
ini akan membuat /index/bla/blamenjadi sama denganindex.php
elkebirmed
karena alasan tertentu ini memblokir CSS saya untuk dimuat: /
TheCrazyProfessor
! tidak berarti. Aturan tersebut mengatakan untuk hanya menulis ulang untuk menambahkan .php jika belum diakhiri dengan .php
user339568
72

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_rewritebekerja 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_rewritepanduan dan saya pikir beberapa hal yang ingin Anda lakukan tercakup di dalamnya. Panduan mod_rewrite terperinci .

Paksa wwwsubdomain

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/foobukan /~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 .phpekstensi

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 RewriteBasearahan. Tetapi jika Anda melakukannya maka masalah ini menjadi jauh lebih rumit karena Anda akan memerlukan RewriteCondarahan 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 DefaultTypedan DirectoryIndexarahan 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 slashesmembawa 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_rewritewe rewrite dengan syarat sumber daya yang diminta diakhiri dengan a /dan menulis ulang URL dengan mengirimkan kembali 301 Permanent Redirectheader 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 RewriteRuledirektif. 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 .htaccessuntuk 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 .htaccessfile Anda, Anda dapat memaksa server untuk secara otomatis menghapus garis miring yang tertinggal.

Tim Bielawa
sumber
wow terima kasih untuk semua itu. Sebenarnya saya bisa membuatnya berfungsi, ternyata ada beberapa hal aneh di server saya yang harus saya ubah. Bagaimanapun, sekarang ke masalah berikutnya, menghapus .php dari semua halaman kecuali satu. thx man
Dirty Bird Design
Saya suka melihat jawaban yang dipikirkan dengan matang dan teratur. Kerja bagus ... Satu hal yang saya perhatikan: maksud Anda DirectoryIndex index index.html? atau DirectoryIndex index.php index.html?
nicorellius
@nicorellius yakin Anda benar. Saya telah memperbarui jawaban asli saya dengan pengamatan Anda.
Tim Bielawa
Saya harus mengatakan ini tidak selalu berhasil. Coba jawaban di bawah ini (dari pengguna 1079877)
DonJoe
Anda adalah MVP yang sebenarnya.
ZainZaheer06
45

Selain jawaban lain di atas,

Anda juga dapat mencoba ini untuk menghapus ekstensi .php sepenuhnya dari file Anda dan untuk menghindari loop tak terbatas :

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]

Kode ini akan bekerja di Root / .htaccess, Pastikan untuk mengubah RewriteBase jika Anda ingin menempatkan ini ke file htaccess di sub direktori.

Edit:

Pada apache 2.4 dan yang lebih baru, Anda juga dapat menggunakan flag END untuk mencegah kesalahan loop tak terbatas. Contoh berikut berfungsi sama seperti di atas pada apache 2.4,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]
Amit Verma
sumber
10
Hai, Terima kasih untuk ini. Saya telah mencoba banyak solusi untuk memotong .php tetapi hanya ini yang bekerja dengan benar :)
beamkiller
4
Terima kasih! Hasil edit ini adalah di mana pada, apache 2.4, apache 2.5 berakhir di loop tak terbatas (dan akan 500) [AKH] sangat penting
Jake Bolam
23

Kode berikut berfungsi dengan baik untuk saya:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
pengguna1079877
sumber
Ini berfungsi kecuali example.com berubah menjadi indeks dari semua file dan direktori. (Apache 2.4)
earth2jason
10

Setelah mengubah parameter AllowOverridedari Noneke Alldalam /etc/apache2/apache2.conf(Debian 8), mengikuti ini , file .htaccess hanya harus berisi:

Options +MultiViews
AddHandler php5-script php
AddType text/html php

Dan itu cukup untuk menyembunyikan ekstensi .php dari file

Rodney Salcedo
sumber
Berharap yang ini lebih tinggi. Mengapa repot-repot dengan overhead penulisan ulang URL ketika MultiViewsmelakukan ini di luar kotak
Phil
Ini bagus. Ada kekurangan?
direformasi
@formed Terima kasih. Saya harus mengubah tautan dari <a href="somepage.php">tautan </a>ke <a href="somepage">tautan </a>dalam kode sumber
Rodney Salcedo
8

Coba ini
Kode berikut pasti akan berfungsi

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

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
Samarth Saxena
sumber
5

Tidak yakin mengapa jawaban lain tidak berhasil untuk saya, tetapi kode yang saya temukan ini berhasil:

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

Itu semua yang ada di htaccess saya dan example.com/page menunjukkan example.com/page.php

Jon
sumber
4

Untuk menghapus ekstensi .php dari file PHP misalnya yoursite.com/about.php ke yoursite.com/about Ikuti langkah ini. Buka file .htaccess (buat yang baru jika tidak ada) dari root situs Anda, dan tambahkan kode berikut.

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

Untuk menghapus ekstensi .html dari file html misalnya yoursite.com/about.html ke yoursite.com/about Ikuti langkah ini.

Buka file .htaccess (buat yang baru jika tidak ada) dari root situs Anda, dan tambahkan kode berikut.

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

Referensi: Cara Menghapus Ekstensi php dari URL

Sanjeev Kumar
sumber
1
Satu-satunya jawaban yang saya butuhkan. Terima kasih! :)
MatrixCow08
2

Jika Anda melakukan coding dalam PHP dan ingin menghapus .php sehingga Anda dapat memiliki URL seperti:

http://yourdomain.com/blah -> yang mengarah ke /blah.php

Ini semua yang Anda butuhkan:

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
Jeff Hays
sumber
2

Saya menemukan 100% Konsep berfungsi untuk saya:

# Options is required by Many Hosting
Options +MultiViews

RewriteEngine on

# For .php & .html URL's:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Gunakan kode ini di Root file .htaccess situs web Anda seperti:

offline - wamp \ www \ YourWebDir

online - public_html /

Jika tidak berfungsi dengan benar, ubah pengaturan Wamp Server Anda: 1) Klik kiri ikon WAMP 2) Apache 3) Apache Modules 4) Klik kiri rewrite_module

Irshad Khan
sumber
Anda tidak boleh memiliki dua RewriteRuledengan tag di Lsamping satu sama lain. [L]mengatakan mod_rewritebahwa itu adalah aturan terakhir untuk yang ditentukan RewriteCond.
MD XF
2

Berikut adalah kode yang saya gunakan untuk menyembunyikan .phpekstensi dari nama file:

## hide .php extension
# To redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L,NC]

Catatan: R=301untuk pengalihan permanen dan disarankan untuk digunakan untuk tujuan SEO. Namun jika salah satu hanya menginginkan redirect sementara, gantilah dengan justR

Rahul Gupta
sumber
2

Saya berakhir dengan kode kerja berikut:

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

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
Nadeem
sumber
1

Jika url Anda di PHP seperti http://yourdomain.com/demo.php daripada muncul seperti http://yourdomain.com/demo

Ini semua yang Anda butuhkan:

buat file .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Kamlesh
sumber
Ini berhasil http://example.com/myfile tetapi tidak berhasil ke http://example.com/myfolder/(file indeks). Dapatkah Anda membantu saya membuatnya berfungsi untuk file indeks?
Wesley Gonçalves
Saya pikir Anda harus mencoba di atas @starkeen URL jawaban: stackoverflow.com/a/30566026/3786343
Kamlesh
1

Mencoba

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 
Inderjeet
sumber