Entfernen Sie die .php-Erweiterung mit .htaccess

100

Ja, ich habe das Apache-Handbuch gelesen und hier gesucht. Aus irgendeinem Grund kann ich das einfach nicht zum Laufen bringen. Am nächsten kommt es, wenn es die Erweiterung entfernt, aber es zeigt zurück auf das Stammverzeichnis. Ich möchte, dass dies nur in dem Verzeichnis funktioniert, das die .htaccessDatei enthält .

Ich muss drei Dinge mit der .htaccessDatei machen.

  1. Ich brauche es, um die .php zu entfernen

    ein. Ich habe mehrere Seiten, die Registerkarten verwenden, und die URL sieht wie die Registerkarte page.php # aus. Ist dies möglich?

    b. Ich habe eine Seite, die eine an die URL angehängte Sitzungs-ID verwendet, um sicherzustellen, dass Sie vom richtigen Ort gekommen sind www.domain.com/download-software.php?abcdefg.

Ist das möglich? Muss ich dabei auch ".php" aus den Links in meiner Header-Navigations-Include-Datei entfernen? SollteIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Ich möchte, dass "www" vor jeder URL erzwungen wird, also ist es nicht domain.com, aber www.domain.com/page.
  2. Ich möchte alle abschließenden Schrägstriche von den Seiten entfernen.

Ich werde weiter suchen, es versuchen usw. Würde es Probleme geben, in einem Unterverzeichnis zu sein?

Schmutziges Vogel-Design
quelle
Ich bin nur neugierig, welchen Nutzen hat das? Ist dies so, dass Ihre Benutzer nicht wissen, auf welche Datei auf Ihrem Server sie zugreifen?
Kolob Canyon
zweifach. Sie wissen also nicht, welche Dateitypen wir bereitstellen, und es sieht einfach sauberer aus. IMO
Dirty Bird Design
Eine weitere verwandte Frage: stackoverflow.com/questions/6534904/… .
Edward

Antworten:

121

Gumbos Antwort in der Frage zum Stapelüberlauf Wie man die .html-Erweiterung mit Apache mod_rewrite versteckt, sollte gut funktionieren.

Zu 1) Ändern Sie die .html in .php

Zu a.) Ja, das ist möglich, fügen Sie einfach #tabder URL hinzu.

Zu b.) Dies ist mit QSA(Query String Append) möglich, siehe unten.

Dies sollte auch in einem Unterverzeichnispfad funktionieren:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
Pekka
quelle
Vielen Dank für Ihren Helfer, aus welchem ​​Grund auch immer, ich wette, da die an die Sitzung angehängte URL in der PHP-Datei fest codiert ist (lange Geschichte), kann ich ohne die oben genannten Informationen darauf zugreifen. Ich bin sehr dankbar für Ihre Hilfe. Dieses .htaccess-Zeug ist schwierig für mich.
Dirty Bird Design
8
@Pekka 웃 Leerzeichen zwischen [L,Leerzeichen entfernen QSA], andernfalls wird ein 500 Internal Server Error verursacht.
Rahil Wazir
Dies wird /index/bla/bladas gleiche sein wieindex.php
elkebirmed
Aus irgendeinem Grund blockiert dies mein CSS zum Laden: /
TheCrazyProfessor
! bedeutet nicht. Diese Regel besagt, dass nur umgeschrieben werden muss, um .php hinzuzufügen, wenn es nicht bereits in .php endet
user339568
72

Apache mod_rewrite

Was Sie suchen, ist mod_rewrite ,

Beschreibung: Bietet eine regelbasierte Umschreib-Engine zum schnellen Umschreiben angeforderter URLs.

Im Allgemeinen mod_rewritewird das angeforderte Dokument mit den angegebenen regulären Ausdrücken abgeglichen und anschließend intern (innerhalb des Apache-Prozesses) oder extern (im Client-Browser) neu geschrieben. Diese Umschreibungen können so einfach sein wie die interne Übersetzung von example.com/foo in eine Anfrage für example.com/foo/bar.

Die Apache-Dokumente enthalten eine mod_rewriteAnleitung, und ich denke, einige der Dinge, die Sie tun möchten, werden darin behandelt. Detaillierte mod_rewrite Anleitung .

Erzwinge die wwwSubdomain

Ich möchte, dass "www" vor jeder URL erzwungen wird, daher ist es nicht domain.com, sondern www.domain.com/page

Die Anleitung zum Umschreiben enthält Anweisungen hierzu im Beispiel Canonical Hostname .

Entfernen Sie die nachgestellten Schrägstriche (Teil 1).

Ich möchte alle abschließenden Schrägstriche von den Seiten entfernen

Ich bin mir nicht sicher, warum Sie dies tun möchten, da die Anleitung zum Umschreiben ein Beispiel für das genaue Gegenteil enthält , dh immer einen abschließenden Schrägstrich enthält. Die Dokumente legen nahe, dass das Entfernen des abschließenden Schrägstrichs ein großes Potenzial für Probleme hat:

Trailing Slash Problem

Beschreibung:

Jeder Webmaster kann ein Lied über das Problem des abschließenden Schrägstrichs in URLs singen, die auf Verzeichnisse verweisen. Wenn sie fehlen, gibt der Server einen Fehler aus, denn wenn Sie /~quux/foostattdessen sagen, /~quux/foo/ sucht der Server nach einer Datei mit dem Namen foo. Und weil diese Datei ein Verzeichnis ist, beschwert sie sich. Eigentlich versucht es in den meisten Fällen, es selbst zu beheben, aber manchmal muss dieser Mechanismus von Ihnen emuliert werden. Zum Beispiel, nachdem Sie viele komplizierte URL-Umschreibungen in CGI-Skripte usw. vorgenommen haben.

Vielleicht könnten Sie näher erläutern, warum Sie den abschließenden Schrägstrich ständig entfernen möchten?

.phpVerlängerung entfernen

Ich brauche es, um die .php zu entfernen

Das nächste, was ich mir vorstellen kann, ist, jedes Anforderungsdokument mit der Erweiterung .php intern neu zu schreiben, dh example.com/somepage wird stattdessen als Anforderung für example.com/somepage.php verarbeitet. Beachten Sie, dass für diese Vorgehensweise jede Seite tatsächlich als somepage.php im Dateisystem vorhanden sein muss.

Mit der richtigen Kombination von regulären Ausdrücken sollte dies bis zu einem gewissen Grad möglich sein. Ich kann jedoch einige mögliche Probleme vorhersehen, wenn Indexseiten nicht korrekt angefordert werden und Verzeichnisse nicht korrekt übereinstimmen.

Dadurch wird beispielsweise example.com/test als Anforderung für example.com/test.php korrekt umgeschrieben:

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

Wird jedoch dazu führen, dass example.com nicht geladen werden kann, da es kein example.com/.php gibt

Ich gehe davon aus, dass das Auswählen einer Anforderung für einen Verzeichnisindex aus einer Anforderung eines Dateinamens im übergeordneten Verzeichnis fast unmöglich wird, wenn Sie alle nachgestellten Schrägstriche entfernen. Wie ermitteln Sie eine Anfrage für das Verzeichnis 'foobar':

example.com/foobar

aus einer Anfrage für eine Datei namens foobar (die eigentlich foobar.php ist)

example.com/foobar

Es könnte möglich sein, wenn Sie die RewriteBaseDirektive verwendet haben. Wenn Sie dies tun, wird dieses Problem jedoch viel komplizierter, da Sie RewriteCondAnweisungen benötigen , um auf Dateisystemebene zu überprüfen, ob die Anforderung einem Verzeichnis oder einer Datei zugeordnet ist.

Das heißt, wenn Sie Ihre Anforderung entfernen, alle nachgestellten Schrägstriche zu entfernen und stattdessen nachfolgende Schrägstriche zwangsweise hinzuzufügen, wird das Problem "Keine .php-Erweiterung" etwas vernünftiger.

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

Dies ist immer noch nicht perfekt - an jede Anforderung für eine Datei wird immer noch .php intern an die Anforderung angehängt. Eine Anfrage für 'hi.txt' fügt dies in Ihre Fehlerprotokolle ein:

[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

Es gibt aber noch eine andere Option: Setzen Sie die Anweisungen DefaultTypeund DirectoryIndexwie folgt :

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

Update 14.11.2013 - Das obige Snippet wurde korrigiert, um die Beobachtung von Nicorellius zu berücksichtigen

Jetzt sind Anforderungen für hi.txt (und alles andere) erfolgreich, Anforderungen an example.com/test geben die verarbeitete Version von test.php zurück und index.php-Dateien funktionieren wieder.

Ich muss Kredit geben, wo Kredit für diese Lösung fällig ist, wie ich es Michael J. Radwins Blog gefunden habe, indem ich Google nach PHP ohne Erweiterung Apache durchsucht habe .

Entfernen Sie nachgestellte Schrägstriche

Einige apache remove trailing slashesSuchanfragen haben mich zu einigen Seiten zur Suchmaschinenoptimierung geführt. Anscheinend stellen einige Content-Management-Systeme (in diesem Fall Drupal) Inhalte mit und ohne abschließenden Schrägstrich in URls zur Verfügung, was in der SEO-Welt dazu führt, dass Ihre Website eine doppelte Inhaltsstrafe erleidet. Quelle

Die Lösung scheint ziemlich trivial zu sein, da mod_rewritewir unter der Bedingung, dass die angeforderte Ressource mit a endet, /neu schreiben und die URL durch Zurücksenden des 301 Permanent RedirectHTTP-Headers neu schreiben .

Hier ist sein Beispiel, bei dem davon ausgegangen wird, dass Ihre Domain blamcast.net ist und der Anfrage optional ein Präfix vorangestellt werden kann www..

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

Jetzt kommen wir irgendwohin. Lassen Sie uns alles zusammenfügen und sehen, wie es aussieht.

Obligatorisch www., nein .phpund keine nachgestellten Schrägstriche

Dies setzt voraus, dass die Domain foobar.com ist und auf dem Standardport 80 ausgeführt wird.

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

Das 'R'-Flag wird im RewriteRuleAbschnitt zur Anweisung beschrieben. Snippet:

redirect|R [=code](Umleitung erzwingen) Präfix Ersetzen durch http://thishost[:thisport]/(wodurch die neue URL zu einem URI wird), um eine externe Umleitung zu erzwingen. Wenn kein Code angegeben wird, wird eine HTTP-Antwort von 302 ( MOVED TEMPORARILY ) zurückgegeben.

Schlussbemerkung

Ich konnte die Schrägstrichentfernung nicht erfolgreich ausführen. Die Umleitung führte zu endlosen Umleitungsschleifen. Nachdem ich die ursprüngliche Lösung genauer gelesen habe, habe ich den Eindruck, dass das obige Beispiel für sie funktioniert, da ihre Drupal-Installation konfiguriert ist. Er erwähnt speziell:

Auf einer normalen Drupal-Site mit aktivierten sauberen URLs sind diese beiden Adressen grundsätzlich austauschbar

In Bezug auf URLs, die mit und ohne Schrägstrich enden. Außerdem,

Drupal verwendet eine aufgerufene Datei .htaccess, um Ihrem Webserver mitzuteilen, wie mit URLs umgegangen werden soll. Dies ist dieselbe Datei, die Drupals saubere URL-Magie aktiviert. Durch Hinzufügen eines einfachen Umleitungsbefehls am Anfang Ihrer .htaccessDatei können Sie den Server zwingen, alle nachgestellten Schrägstriche automatisch zu entfernen.

Tim Bielawa
quelle
wow danke für all das. Eigentlich konnte ich es zum Laufen bringen, es stellte sich heraus, dass auf meinem Server einige seltsame Dinge waren, die ich ändern musste. Nun zum nächsten Problem: Entfernen Sie die .php-Datei von allen Seiten außer einer. Danke
Dirty Bird Design
Ich liebe es, gut durchdachte, organisierte Antworten zu sehen. Gute Arbeit ... Eines ist mir aufgefallen: Meinten Sie DirectoryIndex index index.html? oder DirectoryIndex index.php index.html?
Nicorellius
@nicorellius glaube du bist richtig. Ich habe meine ursprüngliche Antwort mit Ihrer Beobachtung aktualisiert.
Tim Bielawa
Ich muss sagen, das funktioniert nicht immer. Versuchen Sie die Antwort unten (von Benutzer 1079877)
DonJoe
Du bist der wahre MVP.
ZainZaheer06
45

Zusätzlich zu anderen Antworten oben,

Sie können auch versuchen , diese .php Erweiterungen komplett aus der Datei zu entfernen und zu vermeiden Endlosschleife :

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]

Dieser Code funktioniert in Root / .htaccess. Ändern Sie unbedingt die RewriteBase, wenn Sie diese in eine htaccess-Datei im Unterverzeichnis ablegen möchten.

Bearbeiten:

Ab Apache 2.4 können Sie auch das END-Flag verwenden, um Endlosschleifenfehler zu vermeiden. Das folgende Beispiel funktioniert genauso wie oben in Apache 2.4.

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]
Amit Verma
quelle
10
Hallo, danke dafür. Ich habe viele Lösungen versucht, um .php zu schneiden, aber nur das hat richtig funktioniert :)
Beamkiller
4
Vielen Dank! Diese Bearbeitung ist, wo seine bei, Apache 2.4, Apache 2.5 in der Endlosschleife enden (und wird 500) [ENDE] super wichtig
Jake Bolam
23

Der folgende Code funktioniert gut für mich:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
user1079877
quelle
Dies funktioniert, außer dass example.com in einen Index aller Dateien und Verzeichnisse umgewandelt wird. (Apache 2.4)
earth2jason
10

Nach dem Ändern der Parameter AllowOverridevon Nonezu Allin /etc/apache2/apache2.conf(Debian 8), nach dieser muss die .htaccess - Datei nur enthalten:

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

Und es war genug, um die .php-Erweiterung vor Dateien zu verbergen

Rodney Salcedo
quelle
Ich wünschte, dieser wäre höher. Warum sich mit dem Aufwand für das Umschreiben von URLs beschäftigen, wenn MultiViewsdies
Phil
Das ist toll. Irgendwelche Nachteile?
Reformiert am
@ reformiert Danke. Ich musste Links von <a href="somepage.php">Link </a>zu <a href="somepage">Link </a>im Quellcode ändern
Rodney Salcedo
8

Versuchen Sie dies
Der folgende Code wird definitiv funktionieren

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
quelle
5

Ich bin mir nicht sicher, warum die anderen Antworten bei mir nicht funktionierten, aber dieser Code, den ich gefunden habe, hat Folgendes getan:

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

Das ist alles, was in meinem htaccess steht und example.com/page zeigt example.com/page.php

Jon
quelle
4

So entfernen Sie die Erweiterung .php aus einer PHP-Datei, z. B. Ihre Website.com/about.php, zu Ihrer Website.com/about. Führen Sie die folgenden Schritte aus. Öffnen Sie die .htaccess-Datei (erstellen Sie eine neue, falls nicht vorhanden) im Stammverzeichnis Ihrer Website und fügen Sie den folgenden Code hinzu.

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

So entfernen Sie die Erweiterung .html aus einer HTML-Datei, z. B. Ihre Site.com/about.html, zu Ihrer Site.com/about. Führen Sie die folgenden Schritte aus.

Öffnen Sie die .htaccess-Datei (erstellen Sie eine neue, falls nicht vorhanden) im Stammverzeichnis Ihrer Website und fügen Sie den folgenden Code hinzu.

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

Referenz: So entfernen Sie die PHP-Erweiterung von der URL

Sanjeev Kumar
quelle
1
Die einzige Antwort, die ich brauchte. Vielen Dank! :)
MatrixCow08
2

Wenn Sie in PHP codieren und .php entfernen möchten, können Sie eine URL wie folgt haben:

http://yourdomain.com/blah -> was auf /blah.php verweist

Das ist alles was Sie brauchen:

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

Ich habe 100% funktionierendes Konzept für mich gefunden:

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

Verwenden Sie diesen Code im Stammverzeichnis Ihrer Website .htaccess-Datei wie folgt:

offline - wamp \ www \ YourWebDir

online - public_html /

Wenn es nicht richtig funktioniert, ändern Sie die Einstellungen Ihres Wamp-Servers: 1) Klicken Sie mit der linken Maustaste auf das WAMP-Symbol. 2) Apache 3) Apache-Module. 4) Klicken Sie mit der linken Maustaste auf rewrite_module

Irshad Khan
quelle
Sie können nicht zwei RewriteRules mit dem Tag Lnebeneinander haben. [L]sagt, mod_rewritedass es die letzte Regel für die angegebene ist RewriteCond.
MD XF
2

Hier ist der Code, mit dem ich die .phpErweiterung vor dem Dateinamen ausgeblendet habe:

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

Hinweis: R=301dient der permanenten Weiterleitung und wird für SEO-Zwecke empfohlen. Wenn Sie jedoch nur eine vorübergehende Weiterleitung wünschen, ersetzen Sie diese durch justR

Rahul Gupta
quelle
2

Ich habe den folgenden Arbeitscode erhalten:

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

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

Wenn Ihre URL in PHP http://yourdomain.com/demo.php mag, dann kommt sie wie http://yourdomain.com/demo

Das ist alles was Sie brauchen:

Datei erstellen .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Kamlesh
quelle
Es hat funktioniert, http://example.com/myfile aber es hat nicht funktioniert http://example.com/myfolder/(Indexdatei). Können Sie mir helfen, dass es für die Indexdatei funktioniert?
Wesley Gonçalves
Ich denke, Sie sollten oben @starkeen Antwort-URL versuchen: stackoverflow.com/a/30566026/3786343
Kamlesh
1

Versuchen

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