2009-05-25 11 views
3

ich die Kohana Rahmen bin mit (aber ich denke, es ist für diese Frage irrelevant ist) und Seiten können wie soEntfernen index.php von Website-URLs

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

Jetzt zugegriffen werden, als Faustregel, ich in der Regel Probieren und optimieren Sie meine .htaccess, um nur einen Weg für eine Seite hereinzulassen, und leiten Sie andere gebräuchliche Weisen leise um.

Im Wesentlichen in der ersten URL oben ist die Adresse tatsächlich intern zum zweiten Beispiel umgeleitet.

Was ich tun möchte, ist, URLs des zweiten Typs in URLs des ersten Typs zu verwandeln. Ich bin nicht oft zuversichtlich in .htaccess, und mein erster Versuch wird einige unerwartete Ergebnisse (wie Endlosschleifen gelegentlich) zu werfen

Hier ist, was ich mit

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

Kann mir jemand sagen, was mache ich falsch, und wenn Sie auch auf dieses Problem gestoßen sind, wie haben Sie es gelöst?

EDIT

Ich habe beschlossen, meine ganze .htaccess zu veröffentlichen, damit alle meine Umleitungen untersucht werden kann.

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

Antwort

3

Try this:

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

Was du nicht verarbeiten ist, dass alle Anfragen unterliegen der Umschreiben, und wenn Sie eine Rewrite tun erzeugen sie eine subrequest - die auch Gegenstand ist umschreiben. Sie schreiben also/articles in /index.php/articles, dann schreiben Sie in der Unteranfrage dieses Artikels /index.php/articles to/articles und erzeugen eine neue Anfrage für die 301 Redirect, und so weiter. Das Hinzufügen des NS-Flags bewirkt, dass diese Regel nicht auf Unteranfragen angewendet wird, was meines Erachtens Ihr Problem beheben sollte, es sei denn, Sie machen auch einen 301 auf der/articles -> /index.php/articlesnewrite (aber das wäre Wahnsinn).

+0

Was macht NS Chaos? – alex

+0

Als Antwort auf Sie bearbeiten: Denken Sie, ich muss einen RewriteCond einrichten? Ich habe versucht, diese Flagge hinzuzufügen, und es ist immer noch Looping. Irgendwelche Vorschläge? +1 für deine Probleme :) – alex

+0

Ich glaube nicht, dass ein RewriteCond notwendig oder hilfreich ist, nein. Ich kann nicht sehen, warum die fortgesetzten Schleifen passieren, ohne die Regeln zu sehen, die Sie verwenden, um/articles/to /index.php/articles neu zu schreiben. – chaos