【发布时间】:2015-06-26 19:53:09
【问题描述】:
我正在维护一个大部分由另一个开发团队开发的网站。我正在开发新功能,但有时我不知道某些旧代码究竟是如何工作的。该网站是使用 CodeIgniter 开发的,并且有一个包含单个规则的简单 .htaccess 文件。我不太擅长 PHP 或 mod_rewrite,所以我需要你的帮助。
在 .htaccess 文件中有以下几行:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
我在 Google 上搜索 mod_rewrite,我想上面的代码检查请求的内容是否不是文件或目录,如果不是,它会重写在域之后插入 index.php?/ 的 URL。例如,如果我请求http://www.example.net/teste,它将被重写为http://www.example.net/index.php?/teste。我对吗?我还认为它是为了匹配包含框架中 index.php 的 CodeIgniter 的 URL 格式,对吧?但我觉得奇怪的是,即使在 RewriteRule 终止执行之后,我也无法在 URL 中看到 index.php?/(但这很好,这正是我想要的)。
我现在的问题是我想将所有不带 www 的 URL 重定向到带 www 的 URL。所以,我尝试在 .htaccess 的最后插入这两行:
RewriteCond %{HTTP_HOST} ^example.net
RewriteRule ^ http://www.example.net%{REQUEST_URI} [R=301]
它有效,但现在我可以在 URL 中看到 index.php?/ 部分。我不想显示 index.php?/ 部分。
我做错了吗?你知道一种在不显示 index.php 的情况下在 URL 中包含 www 的方法吗?/ 部分。
谢谢。
===================
更新答案:
大家好,
我将 .htaccess 修改为如下所示:
RewriteEngine On
RewriteBase /
# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{REQUEST_URI} !/system/.* [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
RewriteCond %{HTTP_HOST} ^vesteer\.com\.br$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
成功了。现在一切正常。
感谢大家的回复。
【问题讨论】:
-
我面临的问题的一个例子。如果我访问:“example.net/teste”,我将被重定向到:“www.example.net/index.php?/teste”,但我想要被重定向到:“www.example.net/teste” "
-
嗨,anubhava,你的意思是改变规则的顺序吗?我试过了,但没有用。同样的问题。
-
当我更改顺序时,在 Firefox 中出现同样的问题,在 Chrome 中不会发生重写并且图像不再出现。
-
嘿,anubhava,我找到了一个帮助我解决问题的链接。我无法将答案作为帖子发布,因为我收到了以下消息:“我们不再接受来自此帐户的答案”。但是我在页面上留下了一些 cmets 来解释我是如何解决这个问题的。谢谢。
标签: apache .htaccess mod-rewrite rewrite