Я хотел бы перенаправить 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]