web-dev-qa-db-fra.com

Supprimer "index.php" de l'URL avec .htaccess

J'ai essayé toutes sortes de solutions sur ce site et aucune ne semble fonctionner. J'accueille actuellement avec hostgator. Ceci est mon fichier .htaccess actuel:

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

C'est dans le dossier racine de mon site. J'ai également essayé d'ajouter un ? après index.php et pas de chance. Est-ce que quelqu'un sait pourquoi cela ne fonctionne pas?

13
Norse

C'est le code que vous pouvez utiliser dans votre .htaccess (sous DOCUMENT_ROOT) pour supprimer index.php de l'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]
50
anubhava

Symfony 2 a une excellente solution:

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]

Ceci accomplit ce qui suit:

  • RewriteBase n'est pas nécessaire (utile lorsque le site se trouve dans un sous-répertoire situé sous la racine Web)
  • index.php est supprimé si présent
  • La requête est routée vers le index.php correct avec la chaîne de requête complète de la requête d'origine.

Notez que la ligne:

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

est responsable de la définition de la variable %{ENV:BASE} pour plus tard. Reportez-vous à documentation Apache sur E|env indicateur .

4
Frédéric Klee

J'ai essayé cela et fonctionne bien:

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

Exceptions

Si le répertoire système de votre site (/ system /) a été renommé et est toujours accessible par URL, modifiez la ligne RewriteCond ci-dessus:

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

Si vous exécutez EE à partir d'un sous-répertoire plutôt qu'à la racine de votre domaine (par exemple, http://example.com/myeesite/ au lieu de http://example.com/ ), Supprimez la barre oblique précédant index.php dans la ligne RewriteRule ci-dessus, comme suit:

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

Si vous exécutez EE depuis un sous-répertoire et que cela ne fonctionne toujours pas après la suppression de la barre oblique, vous devrez peut-être spécifier le sous-répertoire dans votre règle de réécriture. Par exemple, si votre sous-dossier est nommé testing, modifiez:

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

À:

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

Et changer:

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

À:

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]
1
stampgo

Réponse mise à jour

Ces jours-ci, j'utilise simplement Wordpress .htaccess comme base: il est relativement simple et fonctionne comme prévu:

<IfModule mod_rewrite.c>
RewriteEngine On

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

Il est également simple de forcer https:// si vous désirez:

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

Post original de 2012

Ma suggestion initiale était de faire d'abord une redirection dure (pour supprimer le index.php) puis une redirection interne vers le index.php.

Le problème est qu’une correspondance de redirection interne gloutonne (par exemple, en utilisant (.*)) semble déclencher à nouveau la redirection matérielle, ce qui entraîne une boucle de redirection infinie.

Je pense qu'il existe une solution plus élégante que ce que je suis sur le point de suggérer, mais je n'ai malheureusement pas le savoir-faire Apache pour y penser.

Ce que je ferais, c’est d’avoir une RewriteRule qui effectue une redirection en dur pour supprimer le index.php, puis un ensemble de règles de redirection interne pour le reprendre. Par exemple:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php(.*)$ /$1 [R,L,QSA]
RewriteRule ^pie$ /index.php?pie [L,QSA]
</IfModule>

Cela semble fonctionner correctement sans produire 500 erreurs. Mais encore une fois, je recommande une pincée de sel.

Bien que cela soit loin d'une bonne solution, j'espère que cela aidera.

1
afeique

Pour supprimer index.php des urls sur Apache2.4 , vous pouvez utiliser la règle suivante:

 RewriteEngine on

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

Cela va changer l'uri

/index.php/foobar

à

/foobar

Cette règle renvoie une erreur de serveur interne pour les versions inférieures d'Apache car elles ne prennent pas en charge l'indicateurEND. S'il vous plaît voir la réponse de Anubhava ci-dessus qui fonctionne presque sur toutes les versions.

0
starkeen

J'ai été obligé de rejoindre stack overflow.com aujourd'hui pour commenter ici car la réponse à ce problème a résolu un problème à long terme rencontré avec un site Web Zend Framework. J'ai travaillé sur le site Web environ 3 ans et demi et au cours de cette période, j'ai découvert qu'il ne gérait pas correctement index.php, ce qui faisait que les outils pour les webmasters voyaient les titres en double, etc.

J'ai décidé de chercher encore une fois aujourd'hui une solution tentée plusieurs fois.

C’est celui (la dernière réponse ci-dessus) qui résout mon problème.

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

Par exemple. c'est ce que cela réalise pour moi.

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

devient

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

Merci à toutes les personnes qui ont contribué à la question initiale car cela a conduit à la réponse et à la solution ci-dessus.

Remarque supplémentaire: j'ai d'autres commandes de réécriture qui gèrent les autres aspects, mais ceux-ci ne résolvent pas le fichier index.php et le seul cas où cela a été corrigé est l'utilisation.

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

J'espère seulement que cela aidera les autres, que ce soit ExpressionEngine ou Zend Framework, dans le futur.

0
Paul