URL重写GET参数

时间:2013-08-10 14:08:53

标签: .htaccess mod-rewrite

我希望我的网址如下所示

www.website.com/home&foo=bar&hello=world

我只想要改变第一个get参数

然而实际的“幕后”网址是这个

www.website.com/index.php?page=home&foo=bar&hello=world

我找到的所有教程都会更改所有参数。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:33)

将此添加到您的网络根.htaccess目录

中的/
RewriteEngine on
RewriteBase /

RewriteRule ^home$ index.php?page=home&%{QUERY_STRING} [NC,L]

如果您希望此功能适用于所有网页,/any-page将作为index.php?page=any-page投放,请使用

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d # not a dir
RewriteCond %{REQUEST_FILENAME} !-f # not a file
RewriteRule ^(.*)$ index.php?page=$1&%{QUERY_STRING} [NC,L]

<小时/>

这些规则如何运作?

RewriteRule具有以下语法

RewriteRule [Pattern] [Substitution] [Flags]

Pattern 可以使用正则表达式,并在主机名和端口(在根目录中放置.htaccess)之后,但在任何查询之前与URL的部分匹配字符串。

第一条规则

模式^home$使第一个规则与传入的网址www.website.com/home匹配。 %{QUERY_STRING}只会抓取/home?之后的任何内容并将其附加到内部替换的网址index.php?page=home

标记NC只是使规则不区分大小写,因此它也匹配/Home/HOME。并且L只是将其标记为最后一次,即如果下面定义了任何其他规则,则重写应停在此处。

第二条规则

这个更通用,即如果您的所有网站页面都遵循此网址模式,那么我们可以只使用此通用网页,而不是编写多个规则,每个网页都有一个规则。

模式.*中的^(.*)$/any-page-name匹配,括号有助于将any-page-name部分捕获为替换网址中使用的$1变量{ {1}}。 index.php?page=$1&中的page=home&只是多个查询字符串字段值对之间使用的分隔符。

最后,page=$1&%{QUERY_STRING}标记与规则1中的标记相同。