Nginx跨域配置中map使用方法

map 指令介绍: map 指令是由 ngx_http_map_module 模块提供的,默认情况下安装nginx都会安装该模块。 map 的主要作用是创建自定义变量,通过使用 nginx 的内置变量,去匹配某些特定规则,如果匹配成功则设置某个值给自定义变量。 而这个自定义变量又可以作于他用。 直接看个例子理解起来比较清晰: 场景: 匹配请求 url 的参数,如果参数是 debug 则设置 $foo = 1 ,默认设置 $foo = 0 map $args $foo { default
分类至 PHP
0条评论

如何删除 DS_Store 文件?

首先,要声明的一点是,删除 DS_Store 文件完全是安全的操作,它不会损害电脑,也不会造成个人数据丢失。删除后,「访达」在打开文件夹是会以默认显示模式显示文件夹。在你进行某些「访达」操作后,系统又会在后台自动创建 DS_Store 文件。

如果你想删除 DS_Store 文件,可以通过「终端」App 进行删除。

  1. 在「访达」中打开「应用程序」> 「实用工具」 > 「终端」。
  2. 定位到你要删除 .DS_Store 文件的文件夹目录下。
  3. 在「终端」里输入`cd`命令,跟上你的目录文件夹路径,例如: `cd /Users/username/pictures`。
  4. 回车。
  5. 输入命令 `find . -name '.DS_Store' -type f -delete`。
  6. 再次回车。

到这里,当前文件夹目录下的所有 .DS_Store 文件都会消失。

分类至 其他
0条评论

Nginx 配置二级域名指向不同的端口

一、问题描述:

    服务器有两个tomcat的,配置为8081端口和8888端口,想通过ss.loveyoursmile.top访问8081端口的tomcat的,通过monitor.loveyoursmile.top。

二,解决方案:

    nginx的示例配置如下:

       server {
              listen    80;
              server_name *.loveyoursmile.top;

              location / {
                            proxy_set_header  Host       $host;
                            proxy_set_header  X-Real-IP    $remote_addr;
                            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                            if ($host ~ ^(monitor)\.loveyoursmile\.top$){
                                          proxy_pass http://0.0.0.0:8888;
                            }
                            if ($host ~ ^(ss)\.loveyoursmile\.top$){
                                          proxy_pass http://0.0.0.0:8081;
                            }
                            proxy_pass http://0.0.0.0:8888;
              }
          }
分类至 PHP
0条评论

Nginx配置中的if判断技巧

当rewrite的重写规则满足不了需求时,比如需要判断当文件不存在时、当路径包含xx时等条件,则需要用到if

if语法

if (表达式) {
    ...
}

表达式语法:

1、正则表达式匹配:

==:等值比较;

~:与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;

~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写;

!~:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写;

!~*:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写;

 

2、文件及目录匹配判断:

-f, !-f:判断指定的路径是否为存在且为文件;

-d, !-d:判断指定的路径是否为存在且为目录;

-e, !-e:判断指定的路径是否存在,文件或目录均可;

-x, !-x:判断指定路径的文件是否存在且可执行;

 

为了配置if的条件判断,这里需要用到nginx中内置的全局变量

$args               这个变量等于请求行中的参数,同$query_string
$content_length     请求头中的Content-length字段。
$content_type       请求头中的Content-Type字段。
$document_root      当前请求在root指令中指定的值。
$host               请求主机头字段,否则为服务器名称。
$http_user_agent    客户端agent信息
$http_cookie        客户端cookie信息
$limit_rate         这个变量可以限制连接速率。
$request_method     客户端请求的动作,通常为GET或POST。
$remote_addr        客户端的IP地址。
$remote_port        客户端的端口。
$remote_user        已经经过Auth Basic Module验证的用户名。
$request_filename   当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme             HTTP方法(如http,https)。
$server_protocol    请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr        服务器地址,在完成一次系统调用后可以确定这个值。
$server_name        服务器名称。
$server_port        请求到达服务器的端口号。
$request_uri        包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri                不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri       与$uri相同。

举例说明

1、如果文件不存在则返回400

if (!-f $request_filename) {
    return 400;
}

2、如果host不是jouypub.com,则301到jouypub.com中

if ( $host != 'jouypub.com' ){
    rewrite ^/(.*)$ https://jouypub.com/$1 permanent;
}

3、如果请求类型不是POST则返回405

if ($request_method = POST) {
    return 405;
}

4、如果参数中有a=1则301到指定域名

if ($args ~ a=1) {
    rewrite ^ http://example.com/ permanent;
}

5、在某种场景下可结合location规则来使用,如:

# 访问 /test.html 时
location = /test.html {
    # 设置默认值为xiaowu
    set $name xiaowu;
    # 如果参数中有 name=xx 则使用该值
    if ($args ~* name=(\w+?)(&|$)) {
        set $name $1;
    }
    # 301
    rewrite ^ /$name.html permanent;
}

上面表示:

/test.html => /xiaowu.html

分类至 PHP
0条评论

Nginx中泛域名二级三级域名的配置

准备换Linux服务器,所以数据迁移暂时需要使用静态页面临时代替一下,之前的article.asp?id=xxx都要重定向到静态文件article/xxx.htm,下面看看Nginx是如何进行Rewrite的!

静态地址重定向到带参数的动态地址
 

rewrite "^(.*)/service/(.*)/.html$" $1/service.php?sid=$2 permanent;



带参数的动态地址重定向到静态地址
 

if ($query_string ~* id=(.*)) {undefined
    set $id $1;
    rewrite "^(.*)/article.asp$" $1/article/$id.htm last;
}

泛域名解析
 

server_name www.w3cgroup.com *.w3cgroup.com;
server_name_in_redirect off;
#设置默认root
set $rootdir /usr/local/nginx/html/w3cgroup/;
#匹配三级域名
if ($host ~* ^([^/.]+)/.([^/.]+)/.([^/.]+)/.([^/.]+)$) {
    set $rootdir /usr/local/nginx/html/w3cgroup/$2/$1;
    #三级域名中有访问指定的目录则重定向到相应的二级域名下
    rewrite "^.+upload/?(.*)$" http://upload.w3cgroup.com/$1 permanent;
    rewrite "^.+ijc/?(.*)$" http://ijc.w3cgroup.com/$1 permanent;
    break;
}
#匹配二级域名
if ($host ~* ^([^/.]+)/.([^/.]+)/.([^/.]+)$) {
    set $rs1 $1;
}
#设置www时root
if ($rs1 ~* ^www$) {
    set $rootdir /usr/local/nginx/html/platform_ig/;
    #二级域名中有访问指定的目录则重定向到相应的二级域名下,注意,这里要使用last
    rewrite "^.+upload/?(.*)$" upload/$1 last;
    rewrite "^.+ijc/?(.*)$" ijc/$1 last;
    break;
}
#设置非www二级域名时root
if ($rs1 !~* ^www$) {
    set $rootdir /usr/local/nginx/html/w3cgroup/$rs1;
    #二级域名中有访问指定的目录则重定向到相应的二级域名下
    rewrite "^.+upload/?(.*)$" http://upload.w3cgroup.com/$1 permanent;
    rewrite "^.+ijc/?(.*)$" http://ijc.w3cgroup.com/$1 permanent;
    break;
}
#应用root
root $rootdir;
index index.php index.html;
error_page 404 http://$host/;

注意:if () {} 之间需要空格,否则Nginx.conf会报unknow directive 错误!

参考:

 

Nginx Rewrite Flags
* last 相当于Apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向
* permanent 返回301永久重定向

Nginx正则表达式匹配
* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

Nginx文件及目录匹配
* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行

Nginx全局变量
$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

分类至 PHP
0条评论

js问号点的作用(?.)和问号问号(??)的用法

js问号点的作用?.和??的用法

第一个:问号点 (?.)

来先看一段js

	const obj = {
		hh:"xxx"
	}
	let res = obj?.data?.list
	   	 let res = obj?.data?.list
<=等价=> let res = obj && obj.data && obj.data.list

 作用就是判断这个对象(this.element)下的(businessObject)下的(value)下的(length)是否为null或者undefined,当其中一链为null或者undefined时就返回undefined,这样即使中间缺少一个属性也不会报错,双问号后面接的就是默认值。

var obj ={}
console.log(obj?.a?.b ?? 233 ) //233
var obj={a:{b:1}}
console.log(obj?.a?.b??233) //1

第二个:问号问号 (??)

console.log(1 || "xx") 			//1
console.log(0 || "xx") 			//xx
console.log(null || "xx")		//xx
console.log(undefined || "xx")  //xx
console.log(-1 || "xx") 		//-1
console.log("" || "xx") 		//xx

console.log(1 ?? "xx")			//1
console.log(0 ?? "xx") 			//0
console.log(null ?? "xx") 		//xx
console.log(undefined ?? "xx")  //xx
console.log(-1 ?? "xx") 		//-1
console.log("" ?? "xx") 		//''

原来这是赋默认值哦

分类至 JS
0条评论

PM2下使用 npm run 命令

需求: npm run xxxx 是 node常用的启动方式之一,本文介绍下如何用PM2来实现该方式的启动。 下面是项目的package.json文件部分代码: scripts: { dev: node build/dev-server.js --env=local, start: node build/dev-server.js --env=local, build: node build/build.js --env=publish, build-local: node build/
分类至 JS
0条评论

禁止国外ip访问服务器,屏蔽国外ip访问网站代码

如果能屏蔽国内ip访问网站,能干掉70%的CC或者ddos攻击,我用的是CentOS先运行如下语句获取国内IP网段,保存到此目录下:root/china_ssr.txt

wget -q --timeout=60 -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /root/china_ssr.txt
将下面脚本保存为/root/allcn.sh ,设置可执行权限

mmode=$1
 
#下面语句可以单独执行,不需要每次执行都获取网段表
#wget -q --timeout=60 -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /root/china_ssr.txt
 
CNIP="/root/china_ssr.txt"
 
 
gen_iplist() {
        cat <<-EOF
                $(cat ${CNIP:=/dev/null} 2>/dev/null)
EOF
}
 
flush_r() {
iptables  -F ALLCNRULE 2>/dev/null
iptables -D INPUT -p tcp -j ALLCNRULE 2>/dev/null
iptables  -X ALLCNRULE 2>/dev/null
ipset -X allcn 2>/dev/null
}
 
mstart() {
ipset create allcn hash:net 2>/dev/null
ipset -! -R <<-EOF 
$(gen_iplist | sed -e "s/^/add allcn /")
EOF
 
iptables -N ALLCNRULE 
iptables -I INPUT -p tcp -j ALLCNRULE 
iptables -A ALLCNRULE -s 127.0.0.0/8 -j RETURN
iptables -A ALLCNRULE -s 169.254.0.0/16 -j RETURN
iptables -A ALLCNRULE -s 224.0.0.0/4 -j RETURN
iptables -A ALLCNRULE -s 255.255.255.255 -j RETURN
#可在此增加你的公网网段,避免调试ipset时出现自己无法访问的情况
 
iptables -A ALLCNRULE -m set --match-set allcn  src -j RETURN 
iptables -A ALLCNRULE -p tcp -j DROP 
 
 
}
 
if [ "$mmode" == "stop" ] ;then
flush_r
exit 0
fi
 
flush_r
sleep 1
mstart
执行下面代码,执行后国外ip将无法打开网站

/root/allcn.sh
如果要停止的话执行下面这个命令可恢复国外ip访问网站:

/root/allcn.sh stop
注意:代码是建立在你懂脚本命令的情况下,新手小白不要瞎搞

 

分类至 Linux
0条评论