일부 웹사이트를 탐색할 때 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
}
Nginx 403 금지 된 오류를 수정하는 방법은 무엇입니까? 파일 또는 디렉토리 권한을 확인합니다. 2. 확인 파일을 확인하십시오. 3. nginx 구성 파일 확인; 4. nginx를 다시 시작하십시오. 다른 가능한 원인으로는 방화벽 규칙, Selinux 설정 또는 응용 프로그램 문제가 있습니다.
Linux에서 Nginx를 시작하는 단계 : Nginx가 설치되어 있는지 확인하십시오. systemctl start nginx를 사용하여 nginx 서비스를 시작하십시오. SystemCTL을 사용하여 NGINX를 사용하여 시스템 시작시 NGINX의 자동 시작을 활성화하십시오. SystemCTL 상태 nginx를 사용하여 시작이 성공했는지 확인하십시오. 기본 환영 페이지를 보려면 웹 브라우저의 http : // localhost를 방문하십시오.
서버는 요청 된 리소스에 액세스 할 수있는 권한이 없으므로 Nginx 403 오류가 발생합니다. 솔루션에는 다음이 포함됩니다. 파일 권한 확인 권한을 확인하십시오. .htaccess 구성을 확인하십시오. nginx 구성을 확인하십시오. Selinux 권한을 구성하십시오. 방화벽 규칙을 확인하십시오. 브라우저 문제, 서버 장애 또는 기타 가능한 오류와 같은 다른 원인을 해결하십시오.
nginx가 시작되었는지 확인하는 방법 : 1. 명령 줄을 사용하십시오 : SystemCTL 상태 nginx (linux/unix), netstat -ano | Findstr 80 (Windows); 2. 포트 80이 열려 있는지 확인하십시오. 3. 시스템 로그에서 nginx 시작 메시지를 확인하십시오. 4. Nagios, Zabbix 및 Icinga와 같은 타사 도구를 사용하십시오.
Windows에서 Nginx를 구성하는 방법은 무엇입니까? nginx를 설치하고 가상 호스트 구성을 만듭니다. 기본 구성 파일을 수정하고 가상 호스트 구성을 포함하십시오. 시작 또는 새로 고침 Nginx. 구성을 테스트하고 웹 사이트를보십시오. SSL을 선택적으로 활성화하고 SSL 인증서를 구성하십시오. 포트 80 및 443 트래픽을 허용하도록 방화벽을 선택적으로 설정하십시오.
Nginx 크로스 도메인 문제를 해결하는 두 가지 방법이 있습니다. 크로스 도메인 응답 헤더 수정 : 교차 도메인 요청을 허용하고 허용 된 메소드 및 헤더를 지정하고 캐시 시간을 설정하는 지시문을 추가하십시오. CORS 모듈 사용 : 모듈을 활성화하고 CORS 규칙을 구성하여 크로스 도메인 요청, 메소드, 헤더 및 캐시 시간을 허용합니다.
Linux에서는 다음 명령을 사용하여 nginx가 시작되었는지 확인하십시오. SystemCTL 상태 Nginx 판사 명령 출력에 따라 : "active : running"이 표시되면 Nginx가 시작됩니다. "Active : 비활성 (죽음)"이 표시되면 Nginx가 중지됩니다.