Usuń rozszerzenie .php za pomocą .htaccess

101

Tak, przeczytałem instrukcję Apache i szukałem tutaj. Z jakiegoś powodu po prostu nie mogę tego uruchomić. Najbliższym osiągnięciem jest usunięcie rozszerzenia, ale wskazuje ono z powrotem na katalog główny. Chcę, żeby to działało w katalogu zawierającym .htaccessplik.

Muszę zrobić trzy rzeczy z .htaccessplikiem.

  1. Potrzebuję go, aby usunąć plik .php

    za. Mam kilka stron, które używają zakładek, a adres URL wygląda jak page.php # tab - czy to możliwe?

    b. Mam jedną stronę, która używa identyfikatora sesji dołączany do adresu URL, aby upewnić się, że pochodzi z właściwym miejscu www.domain.com/download-software.php?abcdefg.

czy to możliwe? Czy robiąc to, muszę usunąć „.php” z linków w moim pliku nagłówkowym nav? PowinienIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Chciałbym, aby wymuszał „www” przed każdym adresem URL, więc nie jest domain.com, ale www.domain.com/page.
  2. Chciałbym usunąć wszystkie końcowe ukośniki ze stron.

Będę dalej szukać, próbować itp. Czy przebywanie w podkatalogu spowoduje jakieś problemy?

Brudny projekt ptaka
źródło
Jestem po prostu ciekawy, co to za korzyść? Czy to dlatego, że Twoi użytkownicy nie wiedzą, do jakiego pliku na serwerze mają dostęp?
Kanion Kolob,
dwa razy. więc nie wiedzą, jakie typy plików obsługujemy, i po prostu wygląda czysto. IMO
Dirty Bird Design
Inne powiązane pytanie: stackoverflow.com/questions/6534904/… .
Edward

Odpowiedzi:

121

Odpowiedź Gumbo w pytaniu Stack Overflow Jak ukryć rozszerzenie .html za pomocą Apache mod_rewrite powinna działać dobrze.

Ad 1) Zmień .html na .php

Re a.) Tak, to możliwe, po prostu dodaj #tabdo adresu URL.

Ad b.) Jest to możliwe przy użyciu QSA(Query String Append), patrz poniżej.

To powinno też działać w ścieżce sub-directory:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
Pekka
źródło
dzięki za pomoc, z jakiegoś powodu. Założę się, że adres url dołączony do sesji jest zakodowany na stałe w pliku PHP (długa historia), jestem w stanie uzyskać do niego dostęp bez powyższego. Naprawdę doceniam twoją pomoc, te rzeczy z .htaccess są dla mnie trudne.
Dirty Bird Design
8
@Pekka 웃 usuń spację między flagami [L,spacji QSA], w przeciwnym razie spowoduje to wewnętrzny błąd 500 serwera .
Rahil Wazir,
to będzie /index/bla/blato samo coindex.php
elkebirmed
z jakiegoś powodu blokuje to ładowanie mojego CSS: /
TheCrazyProfessor
! znaczy nie. Ta reguła mówi, aby przepisać tylko w celu dodania .php, jeśli nie kończy się już na .php
user339568
72

Apache mod_rewrite

To czego szukasz to mod_rewrite ,

Opis: zapewnia mechanizm przepisywania oparty na regułach, który umożliwia natychmiastowe przepisywanie żądanych adresów URL.

Ogólnie rzecz biorąc, mod_rewritedziała dopasowując żądany dokument do określonych wyrażeń regularnych, a następnie wykonuje przepisywanie adresu URL wewnętrznie (w ramach procesu apache) lub zewnętrznie (w przeglądarce klienta). Te przepisy mogą być tak proste, jak wewnętrzne przetłumaczenie example.com/foo na żądanie na przykład.com/foo/bar.

Dokumentacja Apache zawiera mod_rewriteprzewodnik i myślę, że niektóre z rzeczy, które chcesz zrobić, są w nim zawarte. Szczegółowy przewodnik po mod_rewrite .

Wymuś wwwsubdomenę

Chciałbym, aby wymuszał „www” przed każdym adresem URL, więc nie jest to domena.com, ale www.domena.com/strona

Przewodnik po przepisywaniu zawiera instrukcje dotyczące tego w przykładzie nazwy hosta kanonicznego .

Usuń końcowe ukośniki (część 1)

Chciałbym usunąć wszystkie końcowe ukośniki ze stron

Nie jestem pewien, dlaczego chcesz to zrobić, ponieważ przewodnik po przepisywaniu zawiera przykład dokładnie odwrotny , tj. Zawsze zawiera kończący ukośnik. Dokumenty sugerują, że usunięcie końcowego ukośnika może powodować problemy:

Problem z końcowym ukośnikiem

Opis:

Każdy webmaster może zaśpiewać piosenkę o problemie końcowego ukośnika w adresach URL odwołujących się do katalogów. Jeśli ich brakuje, serwer zrzuca błąd, ponieważ jeśli powiesz /~quux/foozamiast /~quux/foo/ tego, serwer wyszuka plik o nazwie foo. A ponieważ ten plik jest katalogiem, narzeka. W rzeczywistości w większości przypadków próbuje to naprawić samodzielnie, ale czasami ten mechanizm musi być przez Ciebie emulowany. Na przykład po wykonaniu wielu skomplikowanych przepisywania adresów URL na skrypty CGI itp.

Być może mógłbyś rozwinąć, dlaczego chcesz cały czas usuwać końcowy ukośnik?

Usuń .phprozszerzenie

Potrzebuję go, aby usunąć plik .php

Najbliższą rzeczą, o której mogę pomyśleć, jest wewnętrzne przepisanie każdego dokumentu żądania z rozszerzeniem .php, tj. Przykład.com/somepage jest zamiast tego przetwarzany jako żądanie na przykład przyklad.com/somepage.php. Zauważ, że postępowanie w ten sposób wymagałoby, aby każda strona faktycznie istniała jako strona.php w systemie plików.

Przy odpowiedniej kombinacji wyrażeń regularnych powinno to być do pewnego stopnia możliwe. Mogę jednak przewidzieć pewne możliwe problemy związane z nieprawidłowym żądaniem stron indeksu i nieprawidłowym dopasowaniem katalogów.

Na przykład spowoduje to poprawne przepisanie example.com/test jako żądania na przykład.com/test.php:

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

Ale spowoduje, że example.com się nie załaduje, ponieważ nie ma example.com/.php

Zgaduję, że jeśli usuniesz wszystkie końcowe ukośniki, to wybranie żądania indeksu katalogu z żądania nazwy pliku w katalogu nadrzędnym stanie się prawie niemożliwe. Jak określić żądanie katalogu „foobar”:

example.com/foobar

z żądania pliku o nazwie foobar (który w rzeczywistości jest foobar.php)

example.com/foobar

Byłoby to możliwe, gdybyś użył RewriteBasedyrektywy. Ale jeśli to zrobisz, problem stanie się znacznie bardziej skomplikowany, ponieważ będziesz wymagać RewriteConddyrektyw do sprawdzania na poziomie systemu plików, czy żądanie jest mapowane do katalogu lub pliku.

To powiedziawszy, jeśli usuniesz wymóg usunięcia wszystkich końcowych ukośników i zamiast tego wymuś dodawanie końcowych ukośników, problem „bez rozszerzenia .php” stanie się nieco bardziej rozsądny.

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

To nadal nie jest idealne - każde żądanie dotyczące pliku nadal ma wewnętrznie dołączany plik .php. Żądanie „hi.txt” spowoduje umieszczenie tego w dziennikach błędów:

[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

Ale jest inna opcja, ustaw dyrektywy DefaultTypei w DirectoryIndexten sposób:

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

Aktualizacja 2013-11-14 - Poprawiono powyższy fragment, aby zawierał obserwację Nicorelliusa

Teraz prośby o plik hi.txt (i wszystko inne) są pomyślne, żądania do example.com/test zwrócą przetworzoną wersję test.php, a pliki index.php będą działać ponownie.

Muszę podać kredyt za to rozwiązanie, ponieważ znalazłem go na blogu Michaela J. Radwinsa , wyszukując w Google hasło php no extension apache .

Usuń końcowe ukośniki

Niektóre wyszukiwania apache remove trailing slashesdoprowadziły mnie do niektórych stron optymalizacji witryn pod kątem wyszukiwarek. Najwyraźniej niektóre systemy zarządzania treścią (w tym przypadku Drupal) udostępnią treść z końcowym ukośnikiem w adresach URls i bez niego, co w świecie SEO spowoduje, że Twoja witryna będzie ponosić karę za powielenie treści. Źródło

Rozwiązanie wydaje się dość trywialne, używając mod_rewriteprzepisywania pod warunkiem, że żądany zasób kończy się na a /i przepisywania adresu URL przez odesłanie 301 Permanent Redirectnagłówka HTTP.

Oto jego przykład, który zakłada, że ​​Twoja domena to blamcast.net i pozwala na opcjonalne poprzedzenie żądania przedrostkiem www..

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

Teraz dokądś zmierzamy. Połączmy to wszystko razem i zobaczmy, jak to wygląda.

Obowiązkowe www., nie .phpi bez końcowych ukośników

Zakłada się, że domena to foobar.com i działa na standardowym porcie 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]

Flaga „R” jest opisana w RewriteRulesekcji dyrektywy. Skrawek:

redirect|R [=code](wymuszenie przekierowania) Podstawienie przedrostka z http://thishost[:thisport]/(co sprawia, że ​​nowy adres URL jest identyfikatorem URI), aby wymusić przekierowanie zewnętrzne. Jeśli nie zostanie podany żaden kod, zostanie zwrócona odpowiedź HTTP o wartości 302 ( PRZENIESIONA TYMCZASOWO ).

Uwaga końcowa

Nie udało mi się doprowadzić do pomyślnego usunięcia ukośnika. Przekierowanie dało mi nieskończone pętle przekierowań. Po bliższym przeczytaniu oryginalnego rozwiązania mam wrażenie, że powyższy przykład działa u nich z powodu konfiguracji ich instalacji Drupala. Wspomina konkretnie:

W normalnej witrynie Drupal, z włączonymi czystymi adresami URL, te dwa adresy są zasadniczo zamienne

W odniesieniu do adresów URL kończących się ukośnikiem i bez. Ponadto,

Drupal używa pliku o nazwie, .htaccessaby poinformować serwer WWW, jak ma obsługiwać adresy URL. Jest to ten sam plik, który umożliwia czystą magię adresów URL w Drupalu. Dodając proste polecenie przekierowania na początku .htaccesspliku, możesz zmusić serwer do automatycznego usunięcia wszelkich końcowych ukośników.

Tim Bielawa
źródło
wow dzięki za to wszystko. Właściwie udało mi się to uruchomić, okazało się, że na moim serwerze były jakieś dziwne rzeczy, które musiałem zmienić. W każdym razie, teraz przejdźmy do następnego problemu, usuwając plik .php ze wszystkich stron oprócz jednej. thx man
Dirty Bird Design
Uwielbiam widzieć dobrze przemyślane, uporządkowane odpowiedzi. Dobra robota ... Zauważyłem jedną rzecz: czy miałeś na myśli DirectoryIndex index index.html? czy DirectoryIndex index.php index.html?
nicorellius
@nicorellius wierzysz, że masz rację. Zaktualizowałem moją pierwotną odpowiedź o Twoją obserwację.
Tim Bielawa
Muszę powiedzieć, że to nie zawsze działa. Wypróbuj odpowiedź poniżej (użytkownika 1079877)
DonJoe
Jesteś prawdziwym MVP.
ZainZaheer06
45

Oprócz innych odpowiedzi powyżej,

Możesz także spróbować całkowicie usunąć rozszerzenia .php z pliku i uniknąć nieskończonej pętli :

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]

Ten kod będzie działał w Root / .htaccess, pamiętaj, aby zmienić RewriteBase, jeśli chcesz umieścić to w pliku htaccess w podkatalogu.

Edytować :

W Apache 2.4 i nowszych możesz również użyć flagi END, aby zapobiec błędowi nieskończonej pętli. Poniższy przykład działa tak samo jak powyżej na Apache 2.4,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]
Amit Verma
źródło
10
Cześć, dzięki za to. Próbowałem wielu rozwiązań do wycinania .php, ale tylko to działało poprawnie :)
beamkiller
4
Dzięki! Ta edycja jest miejscem, w którym jego at, apache 2.4, apache 2.5 kończą się w nieskończonej pętli (i będą 500) [END] super ważne
Jake Bolam
23

Poniższy kod działa dobrze dla mnie:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
user1079877
źródło
Działa z wyjątkiem tego, że example.com zamienia się w indeks wszystkich plików i katalogów. (Apache 2.4)
earth2jason
10

Po zmianie parametru AllowOverrideod Nonedo Allw /etc/apache2/apache2.conf(Debian 8), po to , plik .htaccess tylko musi zawierać:

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

I wystarczyło ukryć rozszerzenie .php z plików

Rodney Salcedo
źródło
Chciałbym, żeby ten był wyżej. Po co zawracać sobie głowę narzutem związanym z przepisywaniem adresów URL, skoro MultiViewsrobi się to po wyjęciu z pudełka
Phil
To jest świetne. Jakieś wady?
zreformowany
@reformed Thanks. Musiałem zmienić linki z <a href="somepage.php">linku </a>na <a href="somepage">link </a>w kodzie źródłowym
Rodney Salcedo
8

Spróbuj tego
Poniższy kod na pewno zadziała

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
źródło
5

Nie wiem, dlaczego inne odpowiedzi nie zadziałały, ale ten kod, który znalazłem, zadziałał:

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

To wszystko, co jest w moim htaccess, a example.com/page pokazuje example.com/page.php

Jon
źródło
4

Aby usunąć rozszerzenie .php z pliku PHP, na przykład twoja_witryna.com/about.php do twoja_witryna.com/about Wykonaj poniższe czynności. Otwórz plik .htaccess (utwórz nowy, jeśli nie istnieje) z katalogu głównego swojej witryny i dodaj następujący kod.

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

Aby usunąć rozszerzenie .html z pliku html, na przykład twoja_witryna.com/about.html do twoja_witryna.com/about Wykonaj poniższe czynności.

Otwórz plik .htaccess (utwórz nowy, jeśli nie istnieje) z katalogu głównego swojej witryny i dodaj następujący kod.

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

Odniesienie: Jak usunąć rozszerzenie php z adresu URL

Sanjeev Kumar
źródło
1
Jedyna odpowiedź, której potrzebowałem. Dzięki! :)
MatrixCow08
2

Jeśli kodujesz w PHP i chcesz usunąć .php, aby mieć adres URL taki jak:

http://twojadomena.com/blah -> co wskazuje na /blah.php

To wszystko, czego potrzebujesz:

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

Znalazłem dla mnie 100% działającą koncepcję:

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

Użyj tego kodu w głównym pliku .htaccess swojej witryny, na przykład:

offline - wamp \ www \ YourWebDir

online - public_html /

Jeśli to nie działa poprawnie, zmień ustawienia serwera Wamp: 1) Kliknij lewym przyciskiem ikonę WAMP 2) Apache 3) Moduły Apache 4) Kliknij lewym przyciskiem myszy rewrite_module

Irshad Khan
źródło
Nie możesz mieć dwóch RewriteRuleznaków Lobok siebie. [L]mówi mod_rewrite, że jest to ostatnia reguła dla określonego RewriteCond.
MD XF
2

Oto kod, którego użyłem, aby ukryć .phprozszerzenie przed nazwą pliku:

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

Uwaga: R=301służy do stałego przekierowania i jest zalecany do celów SEO. Jeśli jednak chcesz tylko tymczasowego przekierowania, zamień je na justR

Rahul Gupta
źródło
2

Skończyłem z następującym działającym kodem:

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

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
Nadeem
źródło
1

Jeśli adres URL w PHP jak http://yourdomain.com/demo.php niż przychodzi jak http://yourdomain.com/demo

To wszystko, czego potrzebujesz:

utwórz plik .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Kamlesh
źródło
Działało, http://example.com/myfile ale nie działało w przypadku http://example.com/myfolder/(plik indeksu). Czy możesz mi pomóc, aby działał dla pliku indeksu?
Wesley Gonçalves
Myślę, że powinieneś spróbować powyżej @starkeen answer URL: stackoverflow.com/a/30566026/3786343
Kamlesh
1

Próbować

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