Назад | Перейти на главную страницу

Как переписать index.php (и другие допустимые файлы по умолчанию) в корень документа с помощью mod_rewrite?

Я хотел бы перенаправить index.php, а также любой другой действительный файл по умолчанию (например, index.html, index.asp и т.д.) в корень документа (который содержит index.php) примерно так:

RewriteRule ^index\.(php|htm|html|asp|cfm|shtml|shtm)/?$ / [NC,L]

Однако это, конечно, дает мне бесконечный цикл перенаправления. Как правильно это сделать?

Если возможно, я хотел бы, чтобы эта работа работала как в среде разработки, так и в производственной среде, поэтому я не хочу указывать явный URL-адрес, например http://www.mysite.com/ как цель.

Спасибо!

Если кто-то найдет это, вот как я использую его для производства и разработки.

# index.php to root
RewriteCond %{HTTP_HOST} ^localhost [NC]
RewriteRule ^index\.(php|htm|html)/?$ /SiteFolder/ [R=301,NC,L]

RewriteCond %{HTTP_HOST} !^localhost [NC]
RewriteRule ^index\.(php|htm|html)/?$ / [R=301,NC,L]

Добавляйте расширения по мере необходимости, разделяя их |

Я уверен, что решение Кароля правильное (RewriteCond в решении Solefald не нужен), и с уважением оспариваю опровержение TMG относительно PageRank.

Во-первых, SEO и PageRank: хотя Мэтт Каттс и верно указал, что перенаправленная страница 301 не (совсем) так эффективна, как прямая ссылка, условие, которое здесь необходимо исправить, относится к дублированному контенту. Если сайт с /index.php и сайт с / приводят к одной и той же странице, это дублированный контент, и (особенно с домашней страницей сайта) это важное соображение: на данной странице всегда должна быть одна и только одна URL, «канонический» URL страницы.

В лучшем случае Google проигнорирует то, что сочтет нужным. В худшем случае он проиндексирует оба, и сайты, ссылающиеся на один вариант, передадут PR этому варианту, а те, которые ссылаются на другой, передадут свой PR другому. Вы должны заставить все страницы ссылаться на одну (и одна должна быть /).

Приведенное выше решение Кароля правильное (вам не нужен RewriteCond) с одним незначительным примечанием: если вы редактируете файл .htaccess, он прав, как написано; если вы редактируете файл конфигурации сервера или контекст VirtualHost, вам нужно сначала добавить косую черту

RewriteRule ^/index\.(php|htm|html|asp|cfm|shtml|shtm)/?$ / [R=301,L]

или, чтобы это работало в любом контексте, используйте? оператор регулярного выражения, чтобы сказать "возможно, косая черта":

RewriteRule ^/?index\.(php|htm|html|asp|cfm|shtml|shtm)/?$ / [R=301,L]

Последний дополнительный момент: убедитесь, что в вашей конфигурации (сервер, виртуальный хост или .htaccess) вы указали как минимум:

DirectoryIndex index.php

Вы можете попробовать 301 перенаправить его. Теоретически это должно быть удобно для поисковых систем.

RewriteRule ^index\.(php|htm|html|asp|cfm|shtml|shtm)/?$ / [R=301,L]

я считать что-то вроде этого должно работать. Убегаю на встречу, поэтому у меня нет времени тестировать, но в основном вам нужно установить условие, чтобы не перенаправлять основной www.site.com/index.php

RewriteEngine On
RewriteCond !^/index.php
RewriteRule ^index\.(php|htm|html|asp|cfm|shtml|shtm)/?$ / [NC,L]