【问题标题】:remove index.php url rewriting .htaccess删除 index.php url 重写 .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/,因为该站点不在服务器的根目录中

标签: php apache .htaccess redirect mod-rewrite


【解决方案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]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多