我想将 index.php 以及任何其他有效的默认文件(例如 index.html、index.asp 等)重定向到文档根目录(包含 index.php),如下所示:
RewriteRule ^index\.(php|htm|html|asp|cfm|shtml|shtm)/?$ / [NC,L]
然而,这当然会给我一个无限的重定向循环。 正确的做法是什么?
如果可能的话,我希望在开发和生产环境中都能做到这一点,所以我不想指定像这样的显式 URLhttp://www.mysite.com/作为目标。
谢谢!
答案1
如果有人发现这一点,下面是我如何将其用于生产和开发。
# 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]
根据需要添加扩展,使用|
答案2
我思考类似这样的方法应该可以工作。要去开会了,所以我没有时间测试它,但基本上你必须设置条件不重定向主www.site.com/index.php
RewriteEngine On
RewriteCond !^/index.php
RewriteRule ^index\.(php|htm|html|asp|cfm|shtml|shtm)/?$ / [NC,L]
答案3
您可以尝试 301 重定向。理论上这应该对搜索引擎友好。
RewriteRule ^index\.(php|htm|html|asp|cfm|shtml|shtm)/?$ / [R=301,L]
答案4
我确信 Karol 的解决方案是正确的(solefald 的解决方案中的 RewriteCond 是不必要的),并且尊重地反驳 TMG 关于 PageRank 的反驳。
首先,SEO 和 PageRank:虽然 Matt Cutts 确实指出 301 重定向页面不如直接链接强大,但这里需要纠正的情况与重复内容有关。如果带有 /index.php 的网站和带有 / 的网站指向同一个页面,则这是重复内容,并且(尤其是网站的主页)有一个重要的考虑因素:给定页面应始终只有一个 URL,即页面的“规范”URL。
在最好的情况下,Google 会忽略它认为应该忽略的那个。在最坏的情况下,它会对两个版本都进行索引,链接到一个版本的网站会将 PR 传递给该版本,而链接到另一个版本的网站会将其 PR 传递给另一个版本。您应该让所有页面都链接到一个版本(并且该版本应该是 /)。
上述 Karol 的解决方案是正确的(您不需要 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