.Php uzantısını .htaccess ile kaldırın


101

Evet, Apache kılavuzunu okudum ve burada aradım. Bazı nedenlerden dolayı bunu çalıştıramıyorum. En yakın geldiğimde uzantıyı kaldırması, ancak kök dizine geri dönüyor. Bunun sadece .htaccessdosyayı içeren dizinde çalışmasını istiyorum .

.htaccessDosya ile üç şey yapmam gerekiyor .

  1. .Php'yi kaldırmak için buna ihtiyacım var

    a. Sekmeleri kullanan birkaç sayfam var ve URL page.php # tab gibi görünüyor - bu mümkün mü?

    b. Doğru yerden geldiğinizden emin olmak için URL'ye eklenen bir oturum kimliğini kullanan bir sayfam var www.domain.com/download-software.php?abcdefg.

Mümkün mü? Ayrıca bunu yaparken, başlık nav include dosyamdaki bağlantılardan ".php" yi kaldırmam gerekir mi? MeliIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Her URL'den önce "www" yi zorlamasını istiyorum, bu yüzden değil domain.com, ama www.domain.com/page.
  2. Sayfalardan tüm eğik çizgileri kaldırmak istiyorum.

Bakmaya, denemeye vb. Devam edeceğim. Bir alt dizinde olmak herhangi bir soruna neden olur mu?



Merak ediyorum, bunun faydası ne? Bu, kullanıcılarınızın sunucunuzdaki hangi dosyaya eriştiklerini bilmemeleri için mi?
Kolob Canyon

iki kat. bu yüzden hangi dosya türlerini sunduğumuzu bilmiyorlar ve daha temiz görünüyor IMO
Dirty Bird Design

Yanıtlar:


122

Gumbo'nun Stack Overflow sorusundaki cevabı .html uzantısı Apache ile nasıl gizlenir mod_rewrite düzgün çalışmalıdır.

Yeniden 1) .html'yi .php olarak değiştirin

Re a.) Evet, bu mümkün, sadece #tabURL'ye ekleyin .

Re b.) Bu, QSA(Query String Append) kullanılarak mümkündür , aşağıya bakın.

Bu aynı zamanda bir alt dizin yolunda da çalışmalıdır:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

yardımın için teşekkürler dostum, her ne sebeple olursa olsun, Id bahis eklenmiş url'nin PHP dosyasında kodlanmış olması nedeniyle (uzun hikaye) Yukarıdakiler olmadan ona erişebiliyorum. Yardımın için gerçekten minnettarım, bu .htaccess işi benim için zor.
Dirty Bird Design

8
@Pekka 웃 [L,boşluk QSA]bayrakları arasındaki boşluğu kaldırın , aksi takdirde 500 Dahili Sunucu Hatası neden olur.
Rahil Wazir

Bu yapacak /index/bla/blaolması aynı şekildeindex.php
elkebirmed

bazı nedenlerden dolayı bu
CSS'min

! demek değil. Bu kural, zaten .php ile bitmiyorsa .php eklemek için yeniden yazılmasını söylüyor
user339568

72

Apache mod_rewrite

Aradığınız şey mod_rewrite ,

Açıklama: İstenen URL'leri anında yeniden yazmak için kural tabanlı bir yeniden yazma motoru sağlar.

Genel olarak, mod_rewriteistenen belgeyi belirtilen düzenli ifadelerle eşleştirerek çalışır, ardından dahili olarak (apache sürecinde) veya harici olarak (istemci tarayıcısında) URL yeniden yazma işlemleri gerçekleştirir. Bu yeniden yazma işlemleri, example.com/foo'yu dahili olarak example.com/foo/bar gibi bir isteğe çevirmek kadar basit olabilir.

Apache dokümanları bir mod_rewriterehber içerir ve yapmak istediğiniz bazı şeylerin içinde yer aldığını düşünüyorum. Ayrıntılı mod_rewrite kılavuzu .

Alt alanı wwwzorla

Her url'den önce "www" ifadesini zorlamasını istiyorum, bu nedenle domain.com değil www.domain.com/page

Yeniden yazma kılavuzu, Canonical Hostname örneğinin altında bunun için talimatlar içerir .

Sondaki eğik çizgileri kaldırın (Bölüm 1)

Sondaki tüm eğik çizgileri sayfalardan kaldırmak istiyorum

Yeniden yazma kılavuzu tam tersi için bir örnek içerdiğinden , yani her zaman sonda bir bölü işareti içerdiğinden bunu neden yapmak isteyeceğinizden emin değilim . Dokümanlar, sondaki eğik çizgiyi kaldırmanın sorunlara neden olma açısından büyük bir potansiyele sahip olduğunu göstermektedir:

Sondaki Eğik Çizgi Sorunu

Açıklama:

Her web yöneticisi, dizinlere atıfta bulunan URL'lerin sonundaki eğik çizgi sorunu hakkında bir şarkı söyleyebilir. Eksiklerse, sunucu bir hatayı döker, çünkü /~quux/foobunun yerine söylerseniz /~quux/foo/ , sunucu foo adında bir dosya arar. Ve bu dosya bir dizin olduğu için şikayet ediyor. Aslında çoğu durumda kendi kendine düzeltmeye çalışır, ancak bazen bu mekanizmanın sizin tarafınızdan taklit edilmesi gerekir. Örneğin, CGI betiklerine vb. Birçok karmaşık URL yeniden yazdıktan sonra.

Belki de sondaki eğik çizgiyi neden her zaman kaldırmak istediğinizi açıklayabilirsiniz.

.phpUzantıyı kaldır

.Php'yi kaldırmak için buna ihtiyacım var

Bunu yapmak için düşünebildiğim en yakın şey, .php uzantılı her istek belgesini dahili olarak yeniden yazmaktır, yani, example.com/somepage, bunun yerine example.com/somepage.php için bir istek olarak işlenir. Bu şekilde ilerlemenin, her bir sayfanın dosya sisteminde somepage.php olarak var olmasını gerektireceğini unutmayın.

Düzenli ifadelerin doğru kombinasyonu ile bu bir dereceye kadar mümkün olabilir. Bununla birlikte, dizin sayfalarının doğru şekilde istenmemesi ve dizinlerle doğru şekilde eşleşmemesiyle ilgili bazı olası sorunları öngörebilirim.

Örneğin, bu, example.com/test'i example.com/test.php için bir istek olarak doğru şekilde yeniden yazacaktır:

RewriteEngine  on
RewriteRule ^(.*)$ $1.php

Ancak example.com'un yüklenememesine neden olur çünkü example.com/.php yoktur

Sondaki tüm eğik çizgileri kaldırıyorsanız, ana dizindeki bir dosya adı isteğinden bir dizin dizini için bir istek seçmenin neredeyse imkansız hale geleceğini tahmin edeceğim. 'Foobar' dizini için bir talebi nasıl belirlersiniz:

example.com/foobar

foobar adlı bir dosya talebinden (aslında foobar.php olan)

example.com/foobar

RewriteBaseDirektifi kullanırsanız mümkün olabilir . Ancak bunu yaparsanız RewriteCond, isteğin bir dizin veya dosya ile eşleşip eşleşmediğini dosya sistemi düzeyinde kontrol etmek için yönergelere ihtiyaç duyacağınız için bu sorun daha karmaşık hale gelir .

Bununla birlikte, sondaki tüm eğik çizgileri kaldırma gereksinimini kaldırırsanız ve bunun yerine sondaki eğik çizgileri eklemeye zorlarsanız "no .php uzantısı" sorunu biraz daha makul hale gelir.

# 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]

Bu hala mükemmel değil - bir dosyaya yönelik her istekte hala isteğe dahili olarak .php eklenmiştir. 'Hi.txt' isteği bunu hata günlüklerinize koyacaktır:

[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

Ancak başka bir seçenek daha var, DefaultTypeve DirectoryIndexyönergelerini şu şekilde ayarlayın:

DefaultType application/x-httpd-php
DirectoryIndex index.php index.html

2013-11-14 Güncellemesi - Nicorellius'un gözlemini dahil etmek için yukarıdaki pasaj düzeltildi

Şimdi hi.txt (ve başka herhangi bir şey) için istekler başarılı, example.com/test'e yapılan istekler test.php'nin işlenmiş sürümünü döndürür ve index.php dosyaları yeniden çalışacaktır.

Bu çözüm için gerekli krediyi vermeliyim, bulduğum gibi Michael J. Radwins Blog Google'da php no extension apache'yi arayarak .

Sondaki eğik çizgileri kaldırın

Bazıları araması apache remove trailing slashesbeni bazı Arama Motoru Optimizasyonu sayfalarına getirdi. Görünüşe göre bazı İçerik Yönetim Sistemleri (bu durumda Drupal), URl'lerde eğik çizgi ile ve olmadan içeriği kullanıma sunacak ve bu da SEO dünyasında sitenizin yinelenen içerik cezasına maruz kalmasına neden olacaktır. Kaynak

mod_rewriteİstenen kaynağın bir ile bitmesi koşuluyla /yeniden yazmamız ve 301 Permanent RedirectHTTP başlığını geri göndererek URL'yi yeniden yazmamız durumunda çözüm oldukça önemsiz görünüyor .

Alanınızın blamcast.net olduğunu varsayan ve isteğin isteğe bağlı olarak önek olarak alınmasına izin veren örneği burada www..

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

Şimdi bir yere varıyoruz. Hepsini bir araya getirelim ve neye benzediğini görelim.

Zorunlu www., hayır .phpve sondaki eğik çizgi yok

Bu, alan adının foobar.com olduğunu ve standart 80 numaralı bağlantı noktasında çalıştığını varsayar.

# 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]

'R' bayrağı RewriteRuleyönerge bölümünde açıklanmıştır . Snippet:

redirect|R [=code](yönlendirmeye zorla) http://thishost[:thisport]/Harici yeniden yönlendirmeyi zorlamak için (yeni URL'yi bir URI yapan ) Önek Değiştirme . Kod belirtilmezse, 302 HTTP yanıtı ( GEÇİCİ OLARAK TAŞINMIŞ ) döndürülür.

Son Not

Eğik çizgi kaldırmanın başarılı bir şekilde çalışmasını sağlayamadım. Yeniden yönlendirme bana sonsuz yeniden yönlendirme döngüleri verdi. Orijinal çözümü daha yakından okuduktan sonra , yukarıdaki örneğin Drupal kurulumlarının nasıl yapılandırıldığından dolayı onlar için işe yaradığı izlenimini edindim. O özellikle şunlardan bahseder:

Temiz URL'lerin etkinleştirildiği normal bir Drupal sitesinde, bu iki adres temelde birbirinin yerine kullanılabilir

Eğik çizgiyle ve çizgisiz biten URL'lerle ilgili olarak. Ayrıca,

Drupal, .htaccessweb sunucunuza URL'leri nasıl işleyeceğini bildirmek için adlı bir dosya kullanır . Bu, Drupal'ın temiz URL büyüsünü sağlayan aynı dosyadır. .htaccessDosyanızın başına basit bir yeniden yönlendirme komutu ekleyerek , sunucuyu sondaki eğik çizgileri otomatik olarak kaldırmaya zorlayabilirsiniz.


tüm bunlar için vay teşekkürler. Aslında onu çalıştırmayı başardım, sunucumda değiştirmek zorunda olduğum bazı garip şeyler olduğu ortaya çıktı. Her neyse, şimdi bir sonraki soruna geçelim, .php'yi biri hariç tüm sayfalardan kaldıralım. thx man
Dirty Bird Design

İyi düşünülmüş, organize cevaplar görmeyi seviyorum. Güzel iş ... Fark ettiğim bir şey: demek istedin DirectoryIndex index index.html? veya DirectoryIndex index.php index.html?
nicorellius

@nicorellius doğru olduğuna inanıyor. Orijinal cevabımı gözleminizle güncelledim.
Tim Bielawa

Bunun her zaman işe yaramadığını söylemeliyim. Aşağıdaki yanıtı deneyin (1079877 kullanıcısının)
DonJoe

Sen gerçek MVP'sin.
ZainZaheer06

45

Yukarıdaki diğer cevaplara ek olarak,

Ayrıca, .php uzantılarını dosyanızdan tamamen kaldırmak ve sonsuz döngüden kaçınmak için bunu deneyebilirsiniz :

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]

Bu kod Root / .htaccess'te çalışacaktır. Bunu alt dizindeki bir htaccess dosyasına yerleştirmek istiyorsanız RewriteBase'i değiştirdiğinizden emin olun.

Düzenle :

Apache 2.4 ve sonrasında, sonsuz döngü hatasını önlemek için END bayrağını da kullanabilirsiniz. Aşağıdaki örnek, yukarıdaki apache 2.4 ile aynı şekilde çalışır,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]

10
Merhaba, bunun için teşekkürler.
.Php'yi

4
Teşekkürler! Bu düzenleme, apache 2.4, apache 2.5'in sonsuz döngüde sona erdiği yerdedir (ve 500 olacaktır) [SON] çok önemli
Jake Bolam

23

Aşağıdaki kod benim için iyi çalışıyor:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

Bu, example.com'un tüm dosya ve dizinlerin bir dizinine dönüşmesi dışında çalışır. (Apache 2.4)
earth2jason


10

Parametresini değiştirdikten sonra AllowOverridegelen Noneiçin Allde /etc/apache2/apache2.conf, (Debian 8) Aşağıdaki bu , .htaccess dosyası sadece içermelidir:

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

Ve .php uzantısını dosyalardan gizlemek yeterliydi


Keşke bu daha yüksek olsaydı. MultiViewsBu kutudan çıktığında neden URL yeniden yazma ek yükü ile uğraşasınız?
Phil

Bu harika. Herhangi bir sakınca var mı?
yeniden düzenlendi

@reformed Teşekkürler. Ben gelen değişim bağlantıları vardı <a href="somepage.php">linke </a>etmek <a href="somepage">linke </a>kaynak kodunda
Rodney Salcedo

8

Bunu deneyin
Aşağıdaki kod kesinlikle işe yarayacak

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

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

5

Diğer cevapların neden işe yaramadığından emin değilim ama bulduğum bu kod:

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

Htaccess'imde olanların hepsi bu ve example.com/page, example.com/page.php'yi gösteriyor


4

.Php uzantısını bir PHP dosyasından kaldırmak için, örneğin yoursite.com/about.php ve yoursite.com/about Bu adımı izleyin. Web sitenizin kök dizininden .htaccess (yoksa yeni bir tane oluşturun) dosyasını açın ve aşağıdaki kodu ekleyin.

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

.Html uzantısını bir html dosyasından kaldırmak için, örneğin siteniz.com/about.html siteniz.com/about'a Bu adımı izleyin.

Web sitenizin kök dizininden .htaccess (yoksa yeni bir tane oluşturun) dosyasını açın ve aşağıdaki kodu ekleyin.

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

Referans: URL'den php Uzantısı Nasıl Kaldırılır


1
İhtiyacım olan tek cevap. Teşekkürler! :)
MatrixCow08

2

PHP'de kod yazıyorsanız ve .php'yi kaldırmak istiyorsanız, aşağıdaki gibi bir URL'ye sahip olabilirsiniz:

http://yourdomain.com/blah -> /blah.php'yi işaret eden

Tek ihtiyacınız olan bu:

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

2

Benim için% 100 çalışma konsepti buldum:

# 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]

Bu kodu web sitenizin .htaccess dosyanızın Kökünde kullanın:

çevrimdışı - wamp \ www \ YourWebDir

çevrimiçi - public_html /

Doğru çalışmazsa, Wamp Sunucunuzun ayarlarını değiştirin: 1) WAMP simgesine sol tıklayın 2) Apache 3) Apache Modülleri 4) Sol tıklama rewrite_module


Yan RewriteRuleyana etiketi olan iki URL'ye sahip olamazsınız L. belirtilen için son kural olduğunu [L]söyler . mod_rewriteRewriteCond
MD XF

2

.phpUzantıyı dosya adından gizlemek için kullandığım kod :

## 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]

Not: R=301kalıcı yeniden yönlendirme içindir ve SEO amacıyla kullanılması önerilir. Ancak, bir kişi yalnızca geçici bir yönlendirme isterse, bunu yalnızcaR


2

Aşağıdaki çalışma kodunu buldum:

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

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

1

PHP'deki url'niz http://alaniniz.com/demo.php şeklindeyse, http://alaniniz.com/demo şeklindeyse

Tek ihtiyacınız olan bu:

.htaccess dosyası oluştur

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

İşe yaradı http://example.com/myfile ama işe yaramadı http://example.com/myfolder/(dizin dosyası). Dizin dosyası için çalıştırmama yardım eder misin?
Wesley Gonçalves

: Sana @starkeen cevap URL'ye yukarıdaki denemek gerektiğini düşünüyorum stackoverflow.com/a/30566026/3786343
Kamlesh

1

Deneyin

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.