伪静态规则大全(nginx_Linux)
今天帮朋友写一条伪静态规则,原本以为分分钟能解决的事情,磨了四十分钟才搞定。
由于是在根目录,而且跳转前后参数一致(容易出现死循环)
对于伪静态规则,小北建议大家对已有案例做好笔记,能省下不少事。
下面是几条经典的伪静态规则,供大家学习参考:
permanent参数是永久性重定向,状态码是301
redirect参数临时重定向,状态码是302
一、根目录参数跳转到二级目录
从http://xiaoboy.cn/?url=abc跳转到http://xiaoboy.cn/new/?url=abc
if ( $request_uri ~ ^/\?url= )
{
rewrite ^/(.*)$ /news/$1 redirect;
}
点评:难点在于这是在根目录进行跳转(仅有参数,特征非常不明显),并且前后参数一致(容易出现死循环,跳转到xiaoboy.cn/new/new/new/new/.......)。
二、域名被绑定其它域名,需要其它多个域名跳转到主域名
location / {
if ($host ~ 'httpcn.cn'){
return 301 http://www.xiaoboy.cn$request_uri;
}}
点评:根据host来判断域名,并进行跳转
三、帝国TAGS跳转
location /tags {
rewrite ^/tags-(.*)-(.*)$ /e/tags/index.php?tagid=$1&page=$2;
}
点评:帝国进行tags伪原创后的常规操作,规则非常简单
四、原asp站换帝国cms站,部分tags旧链接可以301到新站点去
location /plug {
rewrite ^/plug/tags\.asp(.*)$ /e/tags/?tagname=$1 redirect;
}
五、江阴人才程序静态化(经典标准款)
location /about {
rewrite ^/about(.*)\.asp$ /ssh5/about$1.html redirect;
}
六、不带www跳转到www版(经典301款)
location / {
if ($http_host ~* "^(xiaoboy\.cn)(:80)?"){
rewrite ^/(.*) http://www.xiaoboy.cn/$1 redirect;
}
}
七、参数跳转
if ($query_string ~* "tag=(.*?)$"){
set $tag $1;
rewrite ^/plug/tags.asp$ /index.php?s=$tag? permanent;
}
说明:
1、第一行"tag=(.*?)$"可替换为(\d+)等数字。
2、第二行set这步不可少
3、最后的?可避免带参数到新URL,美观。
4、nginx 伪静态规则测试时容易出现缓存,测试时建议换个参数。因为这个坑我又耗时一两个小时。
七、404错误页,跳转个域名
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ http://ai.4f.wiki/$1 last;
break;
}
}
小编注:2021.4.30 19:37
今天晚上字库站的$arg_写了好久,由于缓存问题,写代码需要一份自信,不然写对了未生效也是一脸懵,回头还是得多多学习基础语法。
关于写nginx伪静态后,清理本地浏览器缓存问题,一直谜一般的存在。求高人指点!
八、过滤多余杂乱的参数
由于种种原因,带了不同参数,可能意味它是一个不同的文件,会造成各种资源浪费。下面就讲讲如何过滤参数
location /test/ {
if ($args ~* "gpc=stf=(.*?)$") {
rewrite ^ $scheme://$host/test/?s=$arg_s? permanent;
}
}
如上所示,参数中多出很多类似gpc=stf=的参数。那么如何去掉它呢?
首先区分路径test,然后判断gpc=stf=字符,接着直接跳转到新地址,并用$arg_s附上需要的s参数。
实用的数据清洗正则案例
案例1:列表如下三行,我们要提取出它们的主域名即可。
xiaoboy.cn
www.xiaoboy.cn
api.xiaoboy.cn
正则方式太多了,举例如下:
查找目标:\r\n(.*?)\.(.*?)\.cn\r\n
替换目标:\r\n$2.cn\r\n
ps:不是非常严谨,但写的这条规则通用性很强。
案例2:使用正则表达式,将批量的url地址,转成A链接的代码
教程地址:https://www.xiaoboy.cn/jiqiao/498.html
正则表达式的方法,相比excel能省下1-5分钟时间,但需要对代码认识比较清醒,否则不如用excel等工具一步步来。
大家有难解的伪静态规则问题,欢迎交流!如果上述规则能帮到各位老板,欢迎打赏~
关于伪静态,你不得不学的基础知识
~ 为区分大小写的匹配。
~* 不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)。
!~ 不匹配的
!~* 不匹配的
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
——————————————
下面是一些可用的全局变量,可以用做if条件判断(不断补充ing)
$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri
下面是一些nginx内置变量的经典,万变不离其宗。
1. 从请求行中解析的变量
复制代码
以访问http://localhost:80/nginx/varindex?a=1&b=2得到的结果GET /nginx/varindex?a=1&b=2 HTTP/1.1 为例(可以在access.log日志中看到访问结果)
$arg_name
请求行中的参数,$arg_a=1,$arg_b=2,若无参数则为空字符串
$is_args
请求行中是否包含参数,若包含,则$is_args=?,否则为空字符串
$args
请求行中的全部参数,$args=a=1&b=2,若无参数则为空字符串
$request
完整的原始的请求行,GET /nginx/varindex?a=1&b=2 HTTP/1.1
$request_method
请求方法,如GET、POST
$request_uri
完整的原始请求URI,访问的URL除去域名(或IP)和port,如/nginx/varindex?a=1&b=2
$document_uri/$uri
请求规范化以后的URI,可能与$request_uri不同,值可能随请求的处理过程而改变
$server_protocol
请求的协议版本,如HTTP/1.0
以上变量在配置文件中通常配合try_files指令和rewrite指令使用
复制代码
2. 从请求头中解析到的变量
复制代码
$host
请求头的值,以下顺序获得:请求行中的host、请求头中的Host、配置文件中匹配到的server_name
$remote_addr
客户端ip地址
$remote_port
客户端端口
$remote_user
基本身份验证随附的用户名
$http_cookie
Cookie请求头的值
$http_user_agent
用户代理
$cookie_name
Cookie中名为name的值
$http_referer
Http-Referer请求头的值
复制代码
3. 其他变量
复制代码
$cookie_name
名为name的cookie
$protocol
与客户端通信的协议: TCP或UDP(1.11.4)
$hostname
运行nginx的服务器主机名
$server_name
接受请求的服务器主机名
$body_bytes_sent
发送给客户端的字节数
$connection_requests
通过连接发出的当前请求数
$limit_rate
用于设置响应的速度限制
$time_local
通用日志格式的本地时间
$status
响应状态返回码
$request_time
请求处理时间
$proxy_add_x_fowarded_for
在客户端传递来的X-Forwarded-For请求头后面追加$remote_addr(用逗号分隔)
如果客户端没有传递X-Forwarded-For请求头,那么该变量等于$remote_addr
$msec
以毫秒为单位的当前时间
$scheme
请求模式,http或https
$nginx_version
Nginx版本
$pid
工作进程的PID
复制代码
请问怎么联系?
2021-04-07 上午8:26小北QQ:654321114
2021-04-12 下午8:26