일부 웹사이트를 탐색할 때 www.abc.com 또는 www.abcd.com을 입력하면 해당 페이지에 www.abc.com의 홈페이지 콘텐츠가 정상적으로 표시될 수 있다는 사실을 알고 계셨나요? 이것은 nginx rewrite의 사용 시나리오입니다.
다시 쓰기 소개
rewrite는 Nginx 서버에서 제공하는 중요한 기본 기능으로 주로 URL 주소 다시 쓰기를 구현하는 데 사용됩니다.
다시 쓰기 기능의 구현은 pcre 지원에 따라 달라지므로 컴파일 및 설치하기 전에. Nginx 서버에는 pcre 라이브러리를 설치해야 합니다. (nginx는 ngx_http_rewrite_module 모듈을 사용하여 Rewrite 함수의 관련 구성을 구문 분석하고 처리합니다.)
rewrite의 사용법을 제대로 이해하기 전에 명령어와 구문을 종합적이고 체계적으로 연구해야 합니다. rewrite 관련해서 하나씩 알아봅시다
다시 쓰기 규칙
set command
이 명령은 새로운 변수를 설정하는 데 사용됩니다.
변수 이름은 변수의 첫 번째 문자로 "$"를 사용해야 하며 Nginx 서버에서 미리 설정된 전역 변수와 동일한 이름을 가질 수 없습니다.
값; : 변수 값, 문자열, 다른 변수 또는 변수의 조합 등이 될 수 있습니다.
간단한 사례
server {
listen 8081;
server_name localhsot;
location /server {
set $name zhangsan;
set $age 19;
default_type text/plain;
return 200 $name=$age;
}
}
로그인 후 복사
nginx 서비스를 다시 시작한 다음 브라우저에 액세스하여 효과를 관찰하세요
다음은 Rewrite에서 일반적으로 사용되는 전역 변수 목록입니다.
이 변수는 사용 중에 비즈니스에 따라 유연하게 사용할 수 있습니다.
변수
설명
$args
요청 URL의 요청 지침은 변수에 저장됩니다. 예를 들어 http://IP:8080?arg1=value1&args2=value2의 "arg1=value1&arg2=value2"는 $query_string
$http_user_agent
에 액세스하는 사용자의 에이전트 정보를 저장하는 변수입니다. service (브라우징 서버 접속이 브라우저의 해당 버전 정보를 기록하는 경우) 변수는 접속된 서버의 server_name 값을 저장합니다. 변수는 현재 접속 주소의 URI를 저장합니다. 예를 들어 http://IP/server?id=10&name=zhangsan의 "/server"는 $uri
$document_root
와 동일한 기능을 가지고 있습니다. 변수는 현재 요청에 해당하는 위치의 루트 값을 저장합니다. 설정되지 않은 경우 기본적으로 Nginx 자체 html 디렉터리의 위치를 가리킵니다
$content_length
변수는 요청 헤더에 Content-Length 값을 저장합니다
$content_type
변수는 요청 헤더에 Content-Type을 저장합니다. 값
$http_cookie
변수는 클라이언트의 쿠키 정보를 저장합니다. add_header Set-Cookie’cookieName=cookieValue’
$를 통해 쿠키 데이터를 추가할 수 있습니다. limit_rate
변수는 네트워크에 대한 Nginx 서버의 응답을 저장합니다. 연결 속도의 제한, 즉 Nginx 구성에서 Limit_rate 명령에 설정된 값, 기본값은 0, 제한 없음
$remote_addr
변수는 클라이언트의 IP 주소를 저장합니다.
$remote_port
변수는 클라이언트와 서버 간의 연결을 설정하는 데 사용되는 포트 번호를 저장합니다.
$remote_user
변수는 다음 사용자의 이름을 저장합니다. 이를 얻으려면 인증 모듈이 필요합니다.
$scheme
액세스 프로토콜은 변수
$server_addr
변수에 저장됩니다.
$server_name
클라이언트 요청이 도착하는 서버의 이름이 저장되는 변수
$server_port
클라이언트 요청이 도착하는 서버의 이름이 저장되는 변수 서버의 포트 번호
$server_protocol
변수가 저장되는 서버의 포트 번호 "HTTP/1.1"과 같은 클라이언트 요청 프로토콜 버전
$request_body_file
변수는 백엔드 서버로 전송된 로컬 파일 리소스를 저장합니다. 이름
$request_method
변수는 "GET", "POST" 등과 같은 클라이언트의 요청 방법.
$request_filename
변수는 현재 요청된 리소스 파일의 경로 이름을 저장합니다.
$request_uri
변수는 다음의 URI를 저장합니다. 현재 요청을 전달하며 http://IP/server?id=10&name=zhangsan
에서 "/server?id=10&name=zhangsanname"과 같은 요청 매개변수를 전달합니다.
我们来随机测试下几个指令的使用吧
$args
server {
listen 8081;
server_name localhsot;
location /server {
set $name zhangsan;
set $age 19;
default_type text/plain;
return 200 $name=$age=$args;
}
}
로그인 후 복사
其他的指令有兴趣的同学可以自行尝试,下面使用这些指令完成一个需求
自定义日志输出格式,将请求的日志输出到自定义的日志中
具体配置如下:
log_format main '$remote_addr - $request - $status - $request_uri - $http_user_agent';
server {
listen 8081;
server_name localhsot;
location /server {
access_log logs/access-server.log main;
set $name zhangsan;
set $age 19;
default_type text/plain;
return 200 $name=$age=$args=$http_user_agent;
}
}
로그인 후 복사
通过这种方式,就可以实现自定义请求的相关参数输出到自定义的日志文件中
if指令
该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置
condition为判定条件,可以支持以下写法:
1)变量名称,如果变量名对应的值为空或者是0,if都判断为false,其他条件为true
if ($param) {
}
로그인 후 복사
location /testif {
set $username 'zhangsan';
default_type text/plain;
if ($username){
return 200 success;
}
return 200 'params is empty';
}
로그인 후 복사
2) 使用"=“和”!="比较变量和字符串是否相等,满足为true,不满足为false
if ($request_method = POST) {
return 405; 3
}
로그인 후 복사
注意:此处和Java不一样的是字符串不需加引号
3)使用正则表达式对变量匹配
匹配成功返回true,否则返回false;
变量与正则表达式之间使用"“,”“,”!“,”!"来连接;
“~” 代表匹配正则表达式过程中区分大小写;
"~*"代表匹配正则表达式过程中不区分大小写;
"!“和”!*"刚好和上面取相反值,如果匹配上返回false,匹配不上返回true;
if ($http_user_agent ~ MSIE) {
#$http_user_agent的值中是否包含MSIE字符串,如果包含返回 true
}