MOD_REWRITE 用于重写 GET 请求

MOD_REWRITE 用于重写 GET 请求

我需要一个 .htaccess 表达式来使用第二个 get 变量或按名称获取 get 变量。目前我的 mod_rewrite 会更改 URL 以删除 index.php 文件名并更改 pageName GET 变量,使其看起来像文件名。

我现在需要第二个 GET 变量,但是目前的情况是,它甚至无法识别第一次重写后的获取变量,因此我希望 mod_rewrite 处理第二个变量,即“blogpage=1”(1 是您当前所在的博客页面),以便它看起来像这样:

*********.co.uk/PageName/2

而不是这个

*********.co.uk/PageName?blogpage=2

由于这目前不起作用,PHP 脚本只是认为 var 不存在并返回 NULL 值。

这是我当前的 mod_rewrite 条件:

RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^([^/\.]+)/?$ index.php?pageName=$1

答案1

如果重写规则指定了新的查询字符串,Apache 将替换整个查询字符串。要附加,请使用QSA 标志,如mod_rewrite 文档

修改查询字符串

默认情况下,查询字符串会原封不动地传递。但是,您可以在包含查询字符串部分的替换字符串中创建 URL。只需在替换字符串中使用问号即可指示应将以下文本重新注入查询字符串。当您想要删除现有查询字符串时,只需用问号结束替换字符串即可。要合并新旧查询字符串,请使用 [QSA] 标志。

因此,如果你将代码更改为

RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^([^/\.]+)/?$ index.php?pageName=$1 [QSA]

它也应该转发旧的查询字符串。


要进行第二次重写,只需添加另一个具有另一个捕获组的另一条规则。

RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^([^/\.]+)/([0-9]+)$ index.php?pageName=$1&blogpage=$2 [QSA,L]

RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^([^/\.]+)/?$        index.php?pageName=$1 [QSA]

相关内容