> 做站经验技巧 > 伪静态规则大全(nginx_Linux)

伪静态规则大全(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等工具一步步来。

 

大家有难解的伪静态规则问题,欢迎交流!如果上述规则能帮到各位老板,欢迎打赏~

伪静态规则大全(nginx_Linux)

关于伪静态,你不得不学的基础知识

~      为区分大小写的匹配。
~*     不区分大小写的匹配(匹配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
复制代码

网友评论2

  1. 沙发
    多隆:

    请问怎么联系?

    2021-04-07 上午8:26

发表评论

您必须 [ 登录 ] 才能发表留言!