URL重写GET参数

Jam*_*nor 6 .htaccess mod-rewrite

我希望我的网址如下所示

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

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

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

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

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

任何帮助非常感谢!

Rav*_*yal 37

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

RewriteEngine on
RewriteBase /

RewriteRule ^home$ index.php?page=home&%{QUERY_STRING} [NC,L]
Run Code Online (Sandbox Code Playgroud)

如果您希望这适用于所有页面,即/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]
Run Code Online (Sandbox Code Playgroud)


这些规则如何运作?

A RewriteRule具有以下语法

RewriteRule [Pattern] [Substitution] [Flags]
Run Code Online (Sandbox Code Playgroud)

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

第一条规则

该模式^home$使第一个规则与传入的URL匹配www.website.com/home.在%{QUERY_STRING}简单地捕获并追加后的任何/home?以内部取代的URL index.php?page=home.

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

第二条规则

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

.*在模式^(.*)$匹配/any-page-name和括号帮助捕捉any-page-name部分作为$1在替换URL所使用的变量index.php?page=$1.的&page=home&page=$1&仅仅是多个查询字符串字段值对之间使用的隔板.

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

  • 解释会很好 (2认同)
  • @xcy7e 添加了解释:) (2认同)