删除 index.php url 重写 .htaccess

Posted

技术标签:

【中文标题】删除 index.php url 重写 .htaccess【英文标题】:remove index.php url rewriting .htaccess 【发布时间】:2013-09-15 13:14:42 【问题描述】:

我为301 redirect编写了这段代码

RewriteCond %THE_REQUEST ^.*\/index\.php\ HTTP/
RewriteRule ^(.*)index\.php$ /$1 [R=301,L]

如果我以http://mysite.com/index.php 访问我的网站,它会很好地工作,它会将我重定向到http://mysite.com

但是在我的localhost 上,如果我尝试以localhost/mysite/index.php 访问index.php,它会将我重定向到localhost

我该如何解决这个问题?上面写的代码对吗?

【问题讨论】:

在您的本地主机上,您需要在这些行上方添加RewriteBase /mysite/,因为该站点不在服务器的根目录中 【参考方案1】:

看起来您的 htaccess 文件位于服务器的文档根目录中,并且位于 localhost 的 mysite 目录中。由于 htaccess 文件的位置对于它如何路由 URI 非常重要,因此您需要使其与文件的位置无关。您可以通过从条件中提取路径信息而不是传递到规则中以匹配的 URI 来做到这一点:

RewriteCond %THE_REQUEST ^[A-Z]3,9\ /(.*)index\.php($|\ |\?)
RewriteRule ^ /%1 [R=301,L]

%THE_REQUEST 变量是实际 HTTP 请求的第一行,类似于:

GET /path/index.php HTTP/1.1

该模式首先匹配任意数量的可能的METHODS(GET、POST、HEAD 等),然后它创建一组 URI 路径分组,该分组是 before @987654325 @,然后结束匹配,因为我们并不关心 index.php 之后的内容。

【讨论】:

这段代码是如何工作的RewriteCond %THE_REQUEST ^[A-Z]3,9\ /(.*)index\.php($|\ )?关于元素的一点解释 仍然无法处理 localhost。我被重定向到 localhost 而不是 localhost/mysite 它是否捕获了 URL 参数?【参考方案2】:

试试这个

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

【讨论】:

有什么区别? [r=301,nc] [nc] 指定 http 主机不区分大小写。 L 指定了什么? OPs 问题不在于大写/小写,而在于站点基础。 L=Last ... 在此之后将不再处理任何重写。我对添加RewriteBase指令的问题发表了评论【参考方案3】:

如果您的站点不在服务器的根目录(不在您的本地主机上),则需要添加 RewriteBase 指令:https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase

你需要添加一行:

RewriteBase /mysite/

在本地主机上的 htaccess 中的当前行之上

【讨论】:

是否有任何解决方案对双方都有效(即localhostserver【参考方案4】:

虽然RewriteBase 指令代表这种用法,但您可能希望测试 localhost 并仅在 test == true 时将 root 重写到您的子目录。例如:

RewriteCond %HTTP_HOST ^localhost$
RewriteCond %REQUEST_URI !^/subdirectory/
RewriteRule (.*) /subdirectory/$1 [L]

请注意,我已经有一段时间没有使用它了,不能保证它可以开箱即用;可能需要一些修改。

【讨论】:

以上是关于删除 index.php url 重写 .htaccess的主要内容,如果未能解决你的问题,请参考以下文章

仅在具有Nginx重写的root上从URL中删除index.php

.htaccess 在传递给模板之前重写 PATH_INFO 变量为空;不从 url 中删除 index.php

从 zend 框架 1.12 中的 url 中删除 index.php

如何在 Windows Azure 上重写 Codeigniter 的 index.php

重写URL以删除查询字符串

nginx二级目录index.php重写(php)