Удаление index.php из URL-адресов веб-сайтов

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

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

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

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

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

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

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

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

ИЗМЕНИТЬ

Я решил опубликовать весь свой .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]

person alex    schedule 25.05.2009    source источник


Ответы (1)


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

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

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

person chaos    schedule 25.05.2009
comment
В ответ на ваше редактирование: как вы думаете, мне нужно настроить RewriteCond? Я попытался добавить этот флаг, и он все еще зацикливается. Какие-либо предложения? +1 за ваши проблемы :) - person alex; 25.05.2009
comment
Я не думаю, что RewriteCond необходим или полезен, нет. Я не понимаю, почему продолжаются циклы, не видя правил, которые вы используете для перезаписи /articles/ в /index.php/articles. - person chaos; 25.05.2009
comment
Позвольте мне добавить еще немного к моему вопросу. - person alex; 25.05.2009
comment
Да, добавление NS определенно должно остановить циклы. Это в .htaccess, или в файле конфигурации vhost, или в чем-то, где вы могли забыть отключить Apache, чтобы установить измененное правило? - person chaos; 25.05.2009
comment
Это .htaccess. Я использую несколько других переписываний над ним, я постараюсь выделить, какие переписывания не работают хорошо. - person alex; 25.05.2009
comment
K. Вы также можете поэкспериментировать с отключением флага PT в Kohana. Это ничего не должно повредить, но если вы не обнаружите ничего очевидного, то это еще одна переменная, которую нужно исключить. - person chaos; 25.05.2009
comment
Я разместил весь свой .htaccess. Спасибо, что заглянули в этот Хаос. - person alex; 25.05.2009
comment
Что ж, непосредственным подозреваемым может быть ваше другое странное правило, переписывающее запросы, связанные с index.php. Попробуйте добавить NS к этому тоже. - person chaos; 25.05.2009
comment
Блин, она до сих пор крутится! Я даже прокомментировал все это, и не повезло. - person alex; 25.05.2009
comment
Ух ты. дурацкий. Что ж, самое время закомментировать все, кроме основных переписываний Kohana, и начать добавлять элементы по одному. - person chaos; 25.05.2009
comment
Хорошо, прокомментирую снова, когда смогу сказать, что происходит. - person alex; 25.05.2009
comment
Хаос, я удалил все, кроме Kohana .htaccess по умолчанию, и добавил ваше правило под RewriteBase, и оно все еще зацикливается... Должен ли я иметь RewriteCond, который обнаруживает index.php в URL-адресе? - person alex; 25.05.2009
comment
У меня работает Хаос! Я добавил эту строку выше RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)index\.php(.*)\ HTTP/ [NC] - person alex; 25.05.2009
comment
Алекс, ты должен опубликовать это как ответ... Спасибо! - person Boushley; 08.12.2009