5

我写了这段代码301 redirect

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

如果我确实访问我的网站http://mysite.com/index.php,它运行良好,它会将我重定向到http://mysite.com

但是,localhost如果我尝试访问index.php,因为localhost/mysite/index.php它会将我重定向到localhost.

我该如何解决这个问题?上面写的代码是否正确?

4

4 回答 4

6

看起来您的 htaccess 文件位于服务器的文档根目录中,并且位于mysitelocalhost 的目录中。由于 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

该模式首先匹配任意数量的可能方法(GET、POST、HEAD 等),然后它创建 URI 路径之前的分组index.php,然后结束匹配,因为我们并不真正关心index.php.

于 2013-09-11T14:49:28.207 回答
4

试试这个

RewriteRule ^(.*)index\.php$ /$1 [R=301,NC] 
于 2013-09-11T13:32:09.803 回答
2

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

您需要添加以下行:

RewriteBase /mysite/

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

于 2013-09-11T13:43:03.373 回答
0

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

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

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

于 2015-01-21T15:57:09.627 回答