Rimuovi l'estensione .php con .htaccess


101

Sì, ho letto il manuale di Apache e ho cercato qui. Per qualche motivo semplicemente non riesco a farlo funzionare. La cosa più vicina a cui sono arrivato è averlo rimosso l'estensione, ma punta indietro alla directory principale. Voglio che funzioni solo nella directory che contiene il .htaccessfile.

Devo fare tre cose con il .htaccessfile.

  1. Ne ho bisogno per rimuovere il file .php

    un. Ho diverse pagine che utilizzano le schede e l' URL è simile a page.php # tab - è possibile?

    b. Ho una pagina che utilizza un ID di sessione aggiunto all'URL per assicurarsi che siete venuti nel posto giusto, www.domain.com/download-software.php?abcdefg.

È possibile? Anche in questo caso, devo rimuovere ".php" dai collegamenti nel mio file include di navigazione dell'intestazione? DovrebberoIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Vorrei forzare "www" prima di ogni URL, quindi non lo è domain.com, ma www.domain.com/page.
  2. Vorrei rimuovere tutte le barre finali dalle pagine.

Continuerò a cercare, provare, ecc. Essere in una sottodirectory potrebbe causare problemi?



Sono solo curioso, che vantaggio è questo? È così che i tuoi utenti non sanno a quale file sul tuo server stanno accedendo?
Kolob Canyon

due volte. quindi non sanno quali tipi di file stiamo servendo, e sembra semplicemente più pulito IMO
Dirty Bird Design

Un'altra domanda correlata: stackoverflow.com/questions/6534904/… .
Edward

Risposte:


121

La risposta di Gumbo nella domanda Stack Overflow Come nascondere l'estensione .html con Apache mod_rewrite dovrebbe funzionare bene.

Ri 1) Cambia il .html in .php

Rif.) Sì, è possibile, basta aggiungere #taball'URL.

Rif.) È possibile utilizzando QSA(Query String Append), vedi sotto.

Questo dovrebbe funzionare anche in un percorso di sottodirectory:

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

grazie per il tuo aiuto uomo, per qualsiasi motivo, ho scommesso che l'URL aggiunto alla sessione è stato codificato nel file PHP (storia lunga) sono in grado di accedervi senza quanto sopra. Apprezzo molto il tuo aiuto, questa roba .htaccess è complicata per me.
Dirty Bird Design

8
@Pekka 웃 rimuove lo spazio tra [L,i QSA]flag di spazio , altrimenti causerà 500 Errore interno del server .
Rahil Wazir

questo farà /index/bla/blaessere lo stesso diindex.php
elkebirmed il

per qualche motivo questo blocco il mio CSS da caricare: /
TheCrazyProfessor

! significa no. Questa regola dice di riscrivere solo per aggiungere .php se non finisce già in .php
user339568

72

Apache mod_rewrite

Quello che stai cercando è mod_rewrite ,

Descrizione: fornisce un motore di riscrittura basato su regole per riscrivere al volo gli URL richiesti.

In generale, mod_rewritefunziona confrontando il documento richiesto con espressioni regolari specificate, quindi esegue la riscrittura dell'URL internamente (all'interno del processo apache) o esternamente (nel browser del client). Queste riscritture possono essere semplici come tradurre internamente example.com/foo in una richiesta per example.com/foo/bar.

La documentazione di Apache include una mod_rewriteguida e penso che alcune delle cose che vuoi fare siano trattate in essa. Guida dettagliata a mod_rewrite .

Forza il wwwsottodominio

Vorrei forzare "www" prima di ogni URL, quindi non è dominio.com ma www.domain.com/page

La guida alla riscrittura include le istruzioni per questo sotto l' esempio del nome host canonico .

Rimuovi le barre finali (Parte 1)

Vorrei rimuovere tutte le barre finali dalle pagine

Non sono sicuro del motivo per cui dovresti farlo in quanto la guida alla riscrittura include un esempio per l'esatto opposto , ovvero, includendo sempre una barra finale. I documenti suggeriscono che la rimozione della barra finale ha un grande potenziale per causare problemi:

Problema di barra finale

Descrizione:

Ogni webmaster può cantare una canzone sul problema della barra finale sugli URL che fanno riferimento alle directory. Se mancano, il server scarica un errore, perché se dici /~quux/fooinvece di /~quux/foo/ allora il server cerca un file chiamato foo. E poiché questo file è una directory, si lamenta. In realtà cerca di aggiustarlo da solo nella maggior parte dei casi, ma a volte questo meccanismo deve essere emulato da te. Ad esempio, dopo aver eseguito molte complicate riscritture di URL in script CGI, ecc.

Forse potresti approfondire il motivo per cui vuoi rimuovere sempre la barra finale?

Rimuovi .phpestensione

Ne ho bisogno per rimuovere il file .php

La cosa più vicina a questa operazione a cui riesco a pensare è riscrivere internamente ogni documento di richiesta con un'estensione .php, ovvero, example.com/somepage viene invece elaborato come una richiesta per example.com/somepage.php. Notare che procedere in questo modo richiederebbe che ogni somepage esista effettivamente come somepage.php sul filesystem.

Con la giusta combinazione di espressioni regolari questo dovrebbe essere possibile in una certa misura. Tuttavia, posso prevedere alcuni possibili problemi con le pagine indice non richieste correttamente e non corrispondenti alle directory correttamente.

Ad esempio, questo riscriverà correttamente example.com/test come richiesta per example.com/test.php:

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

Ma renderà impossibile caricare example.com perché non c'è example.com/.php

Immagino che se rimuovi tutte le barre finali, scegliere una richiesta per un indice di directory da una richiesta per un nome file nella directory padre diventerà quasi impossibile. Come si determina una richiesta per la directory "foobar":

example.com/foobar

da una richiesta per un file chiamato foobar (che in realtà è foobar.php)

example.com/foobar

Potrebbe essere possibile se hai usato la RewriteBasedirettiva. Ma se lo fai, questo problema diventa molto più complicato in quanto richiederai RewriteCondalle direttive di eseguire il controllo a livello di file system se la richiesta è mappata a una directory oa un file.

Detto questo, se rimuovi la tua esigenza di rimuovere tutte le barre finali e invece aggiungi forzatamente le barre finali, il problema "nessuna estensione .php" diventa un po 'più ragionevole.

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

Questo non è ancora perfetto: ogni richiesta di un file ha ancora .php aggiunto internamente alla richiesta. Una richiesta di "hi.txt" inserirà questo nei tuoi log degli errori:

[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

Ma c'è un'altra opzione, impostare le direttive DefaultTypee in DirectoryIndexquesto modo:

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

Aggiornamento 14-11-2013 - Corretto lo snippet di cui sopra per incorporare l'osservazione di Nicorellius

Ora le richieste per hi.txt (e qualsiasi altra cosa) hanno successo, le richieste a example.com/test restituiranno la versione elaborata di test.php, e i file index.php funzioneranno di nuovo.

Devo riconoscere il merito di questa soluzione perché l'ho trovata sul blog di Michael J. Radwins cercando su Google php senza estensione apache .

Rimuovi le barre finali

Alcune ricerche apache remove trailing slashesmi hanno portato ad alcune pagine di ottimizzazione dei motori di ricerca. Apparentemente alcuni sistemi di gestione dei contenuti (Drupal in questo caso) renderanno i contenuti disponibili con e senza una barra finale negli URL, il che nel mondo SEO farà sì che il tuo sito incorra in una penalità per i contenuti duplicati. fonte

La soluzione sembra abbastanza banale, utilizzando mod_rewriteriscriviamo a condizione che la risorsa richiesta termini con a /e riscriviamo l'URL rimandando indietro l' 301 Permanent Redirectintestazione HTTP.

Ecco il suo esempio che presuppone che il tuo dominio sia blamcast.net e consente alla richiesta di essere facoltativamente preceduta da www..

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

Adesso stiamo arrivando da qualche parte. Mettiamo tutto insieme e vediamo che aspetto ha.

Obbligatorio www., no .phpe nessuna barra finale

Ciò presuppone che il dominio sia foobar.com e che sia in esecuzione sulla porta standard 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]

Il flag "R" è descritto nella RewriteRulesezione direttiva. Frammento:

redirect|R [=code](reindirizzamento forzato) Sostituzione del prefisso con http://thishost[:thisport]/(che rende il nuovo URL un URI) per forzare un reindirizzamento esterno. Se non viene fornito alcun codice, verrà restituita una risposta HTTP di 302 ( SPOSTATO TEMPORANEAMENTE ).

Nota finale

Non sono riuscito a far funzionare correttamente la rimozione della barra. Il reindirizzamento ha finito per darmi infiniti loop di reindirizzamento. Dopo aver letto la soluzione originale più da vicino ho l'impressione che l'esempio sopra funzioni per loro a causa di come è configurata la loro installazione di Drupal. Menziona in particolare:

Su un normale sito Drupal, con URL puliti abilitati, questi due indirizzi sono sostanzialmente intercambiabili

In riferimento agli URL che terminano con e senza una barra. Inoltre,

Drupal usa un file chiamato .htaccessper dire al tuo server web come gestire gli URL. Questo è lo stesso file che abilita la magia pulita degli URL di Drupal. Aggiungendo un semplice comando di reindirizzamento all'inizio del .htaccessfile, è possibile forzare il server a rimuovere automaticamente le barre finali.


wow grazie per tutto questo. In realtà sono riuscito a farlo funzionare, ho scoperto che c'erano alcune cose strane sul mio server che ho dovuto cambiare. Ad ogni modo, ora passiamo al problema successivo, rimuovendo il .php da tutte le pagine tranne una. thx man
Dirty Bird Design

Mi piace vedere risposte ben ponderate e organizzate. Bel lavoro ... Una cosa ho notato: intendevi DirectoryIndex index index.html? o DirectoryIndex index.php index.html?
Nicorellius

@nicorellius credo che tu abbia ragione. Ho aggiornato la mia risposta originale con la tua osservazione.
Tim Bielawa

Devo dire che non sempre funziona. Prova la risposta di seguito (dell'utente 1079877)
DonJoe

Sei il vero MVP.
ZainZaheer06

45

Oltre alle altre risposte sopra,

Puoi anche provare questo per rimuovere completamente le estensioni .php dal tuo file ed evitare cicli infiniti :

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]

Questo codice funzionerà in Root / .htaccess, assicurati di cambiare RewriteBase se vuoi inserirlo in un file htaccess nella sottodirectory.

Modificare :

Su apache 2.4 e versioni successive, puoi anche utilizzare il flag END per evitare errori di loop infinito. Il seguente esempio funziona come sopra su apache 2.4,

RewriteEngine on

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

10
Ciao, grazie per questo. Ho provato molte soluzioni per tagliare .php ma solo questo ha funzionato correttamente :)
beamkiller

4
Grazie! Questa modifica è dove si trova, apache 2.4, apache 2.5 finiscono nel ciclo infinito (e saranno 500) [END] super importante
Jake Bolam

23

Il seguente codice funziona bene per me:

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

Funziona tranne che example.com si trasforma in un indice di tutti i file e le directory. (Apache 2.4)
earth2jason


10

Dopo aver modificato il parametro AllowOverrideda Nonea Alla /etc/apache2/apache2.conf(Debian 8), a seguito di questo , il file .htaccess solo deve contenere:

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

Ed era sufficiente nascondere l'estensione .php dai file


Vorrei che questo fosse più in alto. Perché preoccuparsi del sovraccarico della riscrittura dell'URL quando lo MultiViewsfa fuori dagli schemi
Phil

Questo è fantastico. Qualche inconveniente?
riformato il

@reformed Grazie. Ho dovuto cambiare i link da <a href="somepage.php">link </a>a <a href="somepage">link </a>nel codice sorgente
Rodney Salcedo

8

Prova questo
Il codice seguente funzionerà sicuramente

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

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

5

Non sono sicuro del motivo per cui le altre risposte non hanno funzionato per me, ma questo codice che ho trovato ha funzionato:

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

Questo è tutto ciò che è nel mio htaccess e example.com/page mostra example.com/page.php


4

Per rimuovere l'estensione .php da un file PHP, ad esempio yoursite.com/about.php a yoursite.com/about, segui questi passaggi. Apri il file .htaccess (creane uno nuovo se non esiste) dalla radice del tuo sito web e aggiungi il seguente codice.

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

Per rimuovere l'estensione .html da un file html ad esempio yoursite.com/about.html a yoursite.com/about Segui questi passaggi.

Apri il file .htaccess (creane uno nuovo se non esiste) dalla radice del tuo sito web e aggiungi il seguente codice.

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

Riferimento: come rimuovere l'estensione php dall'URL


1
L'unica risposta di cui avevo bisogno. Grazie! :)
MatrixCow08

2

Se stai codificando in PHP e desideri rimuovere .php in modo da poter avere un URL come:

http://tuodominio.com/blah -> che punta a /blah.php

Questo è tutto ciò di cui hai bisogno:

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

2

Ho trovato Concept funzionante al 100% per me:

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

Usa questo codice nella radice del file .htaccess del tuo sito web come:

offline - wamp \ www \ YourWebDir

online - public_html /

Se non funziona correttamente, modificare le impostazioni del server Wamp: 1) Fare clic con il tasto sinistro sull'icona WAMP 2) Apache 3) Moduli Apache 4) Fare clic con il tasto sinistro su rewrite_module


Non puoi avere due messaggi RewriteRulecon il tag uno Laccanto all'altro. [L]dice mod_rewriteche è l'ultima regola per il file specificato RewriteCond.
MD XF

2

Ecco il codice che ho usato per nascondere l' .phpestensione dal nome del 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]

Nota: R=301è per il reindirizzamento permanente e si consiglia di utilizzare per scopi SEO. Tuttavia, se si desidera solo un reindirizzamento temporaneo, sostituirlo con soloR


2

Ho finito con il seguente codice funzionante:

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

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

1

Se il tuo URL in PHP è come http://tuodominio.com/demo.php allora come http://tuodominio.com/demo

Questo è tutto ciò di cui hai bisogno:

crea il file .htaccess

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

Ha funzionato per http://example.com/myfile ma non ha funzionato su http://example.com/myfolder/(file indice). Potete aiutarmi a farlo funzionare per il file index?
Wesley Gonçalves

Penso che si dovrebbe provare sopra URL risposta @starkeen: stackoverflow.com/a/30566026/3786343
Kamlesh

1

Provare

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.