2012-03-07 13 views
12

Ho provato a provare tutti i tipi di soluzioni da questo sito e nessuno sembra funzionare. Attualmente sto hosting con hostgator. Questo è il mio file .htaccess corrente:Rimuovi 'index.php' dall'URL con .htaccess

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 [L] 
</IfModule> 
<IfModule mod_suphp.c> 
    suPHP_ConfigPath /home/user/php.ini 
    <Files php.ini> 
     order allow,deny 
     deny from all 

    </Files> 
</IfModule> 

Questo è nella cartella principale del mio sito. Ho anche provato ad aggiungere uno ? dopo il index.php e senza fortuna. Qualcuno sa perché questo non funziona?

+0

Cosa stai cercando di fare? Cosa sta succedendo invece? Stai visitando '/index.php? Magic' e ti aspetti un reindirizzamento a'/magic'? – Tim

+1

Il tuo host web sta eseguendo un server Apache: D? – bbedward

+0

@TIM Ho un collegamento su 'www.mysite.com/post.php' che porta a' href = 'index.php'', e quel collegamento mi porta a 'www.mysite.com/index.php' invece di 'www.mysite.com' .... se questo ha un senso. – Norse

risposta

48

Questo è il codice è possibile utilizzare nel vostro .htaccess (sotto DOCUMENT_ROOT) per rimuovere index.php da URI:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?$1 [L,QSA] 

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC] 
RewriteRule^%1 [R=301,L] 
+1

Bello. Grazie. – Norse

+2

Che cosa sarebbe necessario cambiare in queste regole per un url come questo 'http: // site.com/index.php/Page/Param1/Param2' perché sembra che l'intero URL sia tagliato fuori dopo il dominio per me. – Metropolis

+0

@Metropolis: Sì la risposta sopra presuppone che non ci sia nulla tranne i parametri di query dopo 'index.php'. Comunque il tuo URI è '/ index.php/Page/Param1/Param2', posso sapere che cosa vuoi che sia l'URI finale? – anubhava

1

risposta Aggiornato

In questi giorni mi basta usare il Wordpress .htaccess come base: è relativamente semplice e funziona come previsto:

<IfModule mod_rewrite.c> 
RewriteEngine On 

RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

E 'anche semplice da forzare https:// se si desidera:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteCond %{HTTPS} !=on 
RewriteRule (.*) https://%{HTTP_HOST} [L,R=301] 

RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

Originale Post dal 2012

Il mio suggerimento iniziale era di eseguire prima un reindirizzamento (per rimuovere index.php) e poi un reindirizzamento interno a index.php.

Il problema è che un'avida corrispondenza di reindirizzamento interno (ad esempio utilizzando (.*)) sembra attivare nuovamente il reindirizzamento rigido, portando a un ciclo di reindirizzamento infinito.

Ritengo che esista una soluzione più elegante di quella che sto per suggerire, ma sfortunatamente non ho il know-how Apache per pensarci.

Quello che vorrei fare è avere un RewriteRule che esegue un reindirizzamento difficile per rimuovere lo index.php e quindi un insieme di regole di reindirizzamento interno per portarlo da lì. Ad esempio:

Sembra funzionare correttamente senza produrre 500 errori. Ma di nuovo, consiglio un pizzico di sale.

Mentre quello è ben diverso da una buona soluzione, spero che sia d'aiuto.

+0

Ciao e grazie. Ho appena inserito questo nel mio file .htaccess e riporta un errore del server interno di 500. – Norse

+0

Sì, hai ragione. Ero troppo sbrigativo e ho provato questo su una sottodirectory invece della mia web root. Mi armerò un po 'di più e vedrò se riesco a far funzionare qualcosa. – afeique

+0

Ok, ho aggiornato la mia soluzione. Spero sia di qualche utilità. – afeique

1

Ho provato questo e funziona benissimo:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/

    # Removes index.php from ExpressionEngine URLs 
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] 
    RewriteCond %{REQUEST_URI} !/system/.* [NC] 
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

    # Directs all EE web requests through the site index file 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ /index.php/$1 [L] 
</IfModule> 

eccezioni

Se la directory di sistema del tuo sito (/ system /) è stata rinominata ed è ancora accessibile dall'URL, modificare la riga RewriteCond sopra:

RewriteCond %{REQUEST_URI} !/newdirectoryname/.* [NC] 

Se si esegue EE da una sottodirectory piuttosto dalla radice del proprio dominio (ad es. http://example.com/myeesite/ anziché http://example.com/), basta rimuovere la barra dell'indice precedente.php nella linea RewriteRule sopra, in questo modo:

RewriteRule ^(.*)$ index.php/$1 [L] 

Se si esegue EE da un sub-directory e ancora non funziona dopo la rimozione della barra, potrebbe essere necessario specificare la sub-directory nella vostra regola di riscrittura. Ad esempio, se il-sottocartella è denominata test, il cambiamento:

RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

A:

RewriteRule (.*?)index\.php/*(.*) testing/$1$2 [R=301,NE,L] 

E il cambiamento:

RewriteRule ^(.*)$ /index.php/$1 [L] 

A:

RewriteRule ^(.*)$ testing/index.php/$1 [L] 

If your host requires forcing query strings, try adding a question mark following index.php in the RewriteRule line above, like so: 

RewriteRule ^(.*)$ /index.php?/$1 [L] 
0

I Sono stato costretto a unirmi allo stack overflow.com oggi a com qui la risposta ha risolto un problema a lungo termine che ho avuto con un sito web di Zend Framework. Ho lavorato al sito web per circa 3 anni e mezzo e ho scoperto che non gestiva index.php correttamente e questo fa sì che gli strumenti per i webmaster vedano titoli duplicati ecc.

Ho deciso di cercare ancora oggi per una soluzione, una delle tante volte tentate.

Questo è quello (l'ultima risposta mostrata sopra) che risolve il mio problema.

# Removes index.php from ExpressionEngine URLs 
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] 
    RewriteCond %{REQUEST_URI} !/system/.* [NC] 
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

Come esempio. questo è ciò che realizza per me.

http://www.domainname.co.uk/index.php/categories/url-name.html

diventa

http://www.domainname.co.uk/categories/url-name.html

Grazie a tutti coloro che hanno contribuito alla domanda iniziale in quanto conducono alla risposta e la soluzione di cui sopra.

Nota aggiuntiva: Ho altri comandi di riscrittura che gestiscono gli altri aspetti, ma quelli da soli non hanno risolto index.php e l'unica volta che è stato risolto è utilizzando.

# Removes index.php from ExpressionEngine URLs 
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] 
RewriteCond %{REQUEST_URI} !/system/.* [NC] 
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

Spero solo che aiuti gli altri in ExpressionEngine o Zend Framework, in futuro.

3

Symfony 2 ha un'ottima soluzione:

RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ 
RewriteRule ^(.*) - [E=BASE:%1] 

# Sets the HTTP_AUTHORIZATION header removed by apache 
RewriteCond %{HTTP:Authorization} . 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] 


RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule .? - [L] 

RewriteRule .? %{ENV:BASE}/index.php [L] 

Questa compie le seguenti:

  • RewriteBase non è necessario (utile quando il sito è in una sottodirectory sotto la web root)
  • index.php rimosso se presente
  • La richiesta viene instradata allo index.php corretto con la f ull stringa di query dalla richiesta originale

nota che la linea:

RewriteRule ^(.*) - [E=BASE:%1] 

è responsabile per l'impostazione della variabile %{ENV:BASE} per più tardi. Fare riferimento a Apache documentation on E|env flag.

+0

Questo ha funzionato per me – naneri

+1

Non ci credo! Un lavoro "index.php" -remover! Un compito così semplice, così difficile da raggiungere! – TechNyquist

0

Per rimuovere index.php da URL sul apache2.4 è possibile utilizzare la seguente regola:

RewriteEngine on 

RewriteRule ^index\.php/(.+)$ /$1 [L,R] 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule !index\.php /index.php%{REQUEST_URI} [L,END] 

Questo cambierà il uri

/index.php/foobar 

a

/foobar 

Questa regola restituirà un errore interno del server per versioni inferiori di apache in quanto non supportano il flag END. Si prega di vedere la risposta di Anubhava sopra che funziona quasi su tutte le versioni.

Problemi correlati