
(1)nginx伪静态匹配url带问号的返回首页代码:
$resquest_uri表示:包含请求参数的原始URI,不包含主机名
- if ($request_uri ~* "^/\?ad=(.*)$"){
- set $myarg1 $1;
- return 301 http://www.pweb123.com;
- }
$resquest_stringi表示:请求行中(GET请求)的参数
(2)htaccess伪静态写法
RewriteRule是无法匹配到?的,所以需要通过RewriteCond来获取问号后边的所有参数
- RewriteCond %{QUERY_STRING} ^ad=(.+)[NC]
- RewriteRule ^$ /? [R=301,L]
参考资料:
1、htaccess匹配知识
RewriteRule中的 Pattern 部分并不是指的整个URL,而是单纯的问号前面的部分,而且不包含域名(也不包含最前面的一个/)。
如果 Pattern 规则能匹配问号前的地址,则整个地址里的问前地址部分就会被 替换掉,原地址后面的参数部分不变。
如果我们想在htaccess URL Rewrite里校验参数部分,可以使用 %{QUERY_STRING} 内置变量。
RewriteCond %{QUERY_STRING} b=([0-9]+) [NC]
RewriteRule ^a\.html$ /c.html?d=%1 [L,NC]
注意,RewriteCond 里的正则表达式捕捉数据要通过 % 符号获取向后引用。 而 RewriteRule 里的则需要使用 $ 符号获取。
2、nginx伪静态知识
nginx在匹配伪静态规则的时候同样不会去匹配问号后边的参数,所以需要用到一个内置参数
$query_string 解释:请求行中(GET请求)的参数;
$request_uri 解释:包含请求参数的原始URI,不包含主机名,如:"/change.php?id=163",不能修改。
例:
这个表示匹配id=baidu开头的 跳转到百度首页
- if ( $query_string ~ "id=(baidu)(.*)$" )
- {
- rewrite ^/ http://www.baidu.com/;
- }
例:
这个表示匹配整个url中带 id=163的跳转到163.com
- if ( $request_uri ~ "/(.*).html\?id=163" )
- {
- rewrite ^/ http://www.163.com/;
- }
也可以带指定参数,例:
permanent表示问号后边的所有参数,默认也会给你带上的,
- if ($request_uri ~* "^/index.php\?moduleid=(\d+)&itemid=(\d+)$") {
- set $myarg1 $1; //表示第一个参数
- set $myarg2 $2; //表示第二个参数
- rewrite .* https://www.***.com/$myarg1-0-$myarg2-1.html? permanent;
- }
同理还可以直接跳转404页面
更多资料整理中
- if ($request_uri ~ "^/\?ad=(.*)$") {
- return 404;
- }
伪静态我也是一知半解,如果有理解不对之处,敬请指正
文章点评