2009-05-25 10 views
3

J'utilise le cadre Kohana (mais je pense qu'il est hors de propos pour cette question) et les pages sont accessibles comme siSuppression index.php des URL du site

http://www.example.com/articles/ 
http://www.example.com/index.php/articles/ 

Maintenant, en règle générale, je généralement essayez et modifiez mon .htaccess pour n'autoriser qu'une seule entrée dans une page, et redirigez silencieusement d'autres manières communes. En gros, dans la 1ère URL ci-dessus, l'adresse est en réalité redirigée en interne vers le 2ème exemple.

Ce que je veux faire, c'est de forcer les URL du 2ème type à se transformer en URL du premier type. Je ne suis pas souvent confiant dans .htaccess, et ma première tentative est de lancer des résultats inattendus (comme des boucles sans fin à l'occasion)

Voici ce que je suis venu avec

RewriteRule ^index\.php/(.*) $1 [NC,L,R=301] 

Quelqu'un peut-il me dire ce que je fais mal, et si vous avez également rencontré ce problème, comment l'avez-vous résolu?

EDIT

J'ai décidé de poster tout mon .htaccess si tous mes réoriente peuvent être examinées.

# Turn on URL rewriting 
RewriteEngine On 

# Installation directory 
RewriteBase /~toberua/ 


# file not found page 
    ErrorDocument 404 /404/ 
    ErrorDocument 403 /403/ 

# get people out of my directories 
    Options -Indexes 

# default page to load 
    DirectoryIndex index.php 

# add trailing slash if missing 
    RewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L] 

# redirect /favicon.ico requests 
    RewriteCond %{REQUEST_URI} !^/images/layout/favicon\.ico [NC] 
    RewriteCond %{REQUEST_URI} favicon\.(gif|ico|png|jpe?g) [NC] 
    RewriteRule (.*) images/layout/favicon.ico [R=301,L] 

# send /home back to TLD 
    RewriteRule home/ $1 [NC,R=301,L] 

# ensure there is no /index.php in the address bar 
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*index\.php\ HTTP/ 
    RewriteRule ^(.*)index\.php$ $1 [R=301,L] # this was my attempt to stop /dir/index.php and make it simply /dir/ 

    RewriteRule ^index\.php/(.*) $1 [NS,NC,L,R=301] 

# Protect application and system files from being viewed 
RewriteRule ^(application|modules|system) - [F,L] 

# Allow any files or directories that exist to be displayed directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

# Rewrite all other URLs to index.php/URL 
RewriteRule .* index.php/$0 [PT,L] 

Répondre

3

Essayez ceci:

RewriteRule ^index\.php/(.*) $1 [NS,NC,L,R=301] 

Qu'est-ce que vous n'êtes pas le traitement est que toutes demandes sont soumises à la réécriture, et quand vous faites une ré-écriture, il génère un sous-requête - qui est aussi sujet à réécrire. Vous finissez donc par réécrire/articles dans /index.php/articles, puis dans la sous-requête que ce problème, vous réécrivez /index.php/articles en/articles et générez une nouvelle requête pour la redirection 301, ainsi de suite. L'ajout du drapeau NS fera que cette règle ne fonctionnera pas sur les sous-requêtes, ce qui devrait résoudre votre problème, à moins que vous ne fassiez aussi un 301 sur/reexpertes /> /index.php/articles (mais ce serait de la folie).

+0

Qu'est-ce que NS fait du chaos? – alex

+0

En réponse à votre modification: Pensez-vous que je dois configurer un RewriteCond? J'ai essayé d'ajouter ce drapeau et il est toujours en boucle. Aucune suggestion? +1 pour vos problèmes :) – alex

+0

Je ne pense pas qu'un RewriteCond soit nécessaire ou utile, non. Je ne vois pas pourquoi les boucles se poursuivent sans voir les règles que vous utilisez pour réécrire/articles/to/index.php/articles. – chaos

Questions connexes