Удаление index.php из URL сайта - PullRequest
3 голосов
/ 25 мая 2009

Я использую фреймворк Kohana (но я думаю, что он не имеет отношения к этому вопросу), и страницы могут быть доступны, например, так:

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

Теперь, как правило, я обычно пытаюсь настроить свой .htaccess, чтобы разрешить только один путь для страницы, и молча перенаправить другие распространенные способы.

По сути, в первом URL-адресе выше адрес фактически перенаправлен на второй пример.

Что я хочу сделать, так это заставить все URL 2-го типа превращаться в URL первого типа. Я не очень уверен в .htaccess, и моя первая попытка - получить неожиданные результаты (например, бесконечные циклы)

Вот то, что я придумал

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

Может кто-нибудь сказать мне, что я делаю неправильно, и если вы тоже столкнулись с этой проблемой, как вы решили ее?

EDIT

Я решил опубликовать весь свой .htaccess, чтобы можно было проверить все мои перенаправления.

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

1 Ответ

3 голосов
/ 25 мая 2009

Попробуйте это:

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

То, что вы не обрабатываете, так это то, что все запросы подлежат перезаписи, а когда вы переписываете, генерируется подзапрос, который также подлежит перезаписи. Таким образом, вы переписываете / article в /index.php/articles, затем в подзапросе, который вызывает эту проблему, вы переписываете /index.php/articles в / article и генерируете новый запрос на перенаправление 301, и так далее. Добавление флага NS заставит это правило не работать с подзапросами, что, я думаю, должно решить вашу проблему, если вы не делаете 301 для перезаписи / article -> /index.php/articles (но это было бы безумием).

...