.htaccess只重写不重定向

时间:2014-09-11 14:32:14

标签: .htaccess rewrite

我需要一个htaccess来创建以下网址:

domain.com/index.php?page=contact

将链接更改为:

domain.com/contact

所以如果我在做:

<a href="/contact">Contact</a>

该链接将带我到

domain.com/index.php?page=contact

但浏览器链接区域中显示的链接为:

domain.com/contact

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

这应该适合您,它应该放在您的index.php文件所在的根文件夹中,该文件位于名为.htaccess的文件中:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)$ index.php?page=$1 [L]

上述规则的作用是什么?

首先我们检查文件是否不存在:

RewriteCond %{REQUEST_FILENAME} !-f

然后我们检查文件夹是否不存在:

RewriteCond %{REQUEST_FILENAME} !-d

然后我们检查网址是我们要查找的内容,在我们使用的domain.com/anything中:

^([^/]+)$

上述内容将收集/之后的第一个domain.com之后的所有内容,例如:

domain.com/contact
domain.com/about-us
domain.com/home

在方括号之前,我们规则中最右边的部分告诉我们要重定向的内容以及在哪里:

index.php?page=$1

这意味着我们希望将我们从之前规则中收集的内容重定向,上面用$1表示为index.php?page=$1,使用我们之前的示例意味着:

domain.com/index.php?page=contact
domain.com/index.php?page=about-us
domain.com/index.php?page=home

[L]告诉我们要停止,L是一个标志,表示LAST,没有任何重定向标记,并且URL不是外部的或完整的域名,意味着我们想要在内部重定向。

RewriteBase /表示我们位于您域名的根文件夹中。

RewriteEngine On表示我们要激活负责重写重定向的mod_rewrite

在这种情况下,

-MultiViews是唯一相关的Options所以我只会解释一下,当文件夹不存在时,它不会寻找替代品在它的位置服务。