10

我希望我的网址如下所示

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

我只想改变第一个 get 参数

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

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

我发现的所有教程都更改了所有参数。

非常感谢任何帮助!

4

1 回答 1

47

将此添加到您.htaccess的 Web 根/目录中

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]


这些规则如何运作?

ARewriteRule具有以下语法

RewriteRule [Pattern] [Substitution] [Flags]

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

第一条规则

该模式^home$使第一条规则与传入的 URL 相匹配www.website.com/home%{QUERY_STRING}简单地捕获并将任何内容附加到/home?内部替换的 URL之后index.php?page=home

该标志NC只是使规则不区分大小写,因此它也匹配/Home/HOME。并且L简单地将其标记为最后,即重写应该在这里停止,以防下面定义了任何其他规则。

第二条规则

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

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

最后, the%{QUERY_STRING}[NC,L]标志的工作方式与规则一中的相同。

于 2013-08-10T14:24:49.030 回答