>  기사  >  백엔드 개발  >  nginx 위치 구성

nginx 위치 구성

WBOY
WBOY원래의
2016-08-08 09:27:161336검색
문법 규칙: 위치 [=|~|~*|^~] /uri/ { … }
= 로 시작한다는 것은
^~ 으로 시작한다는 것은 uri가 일반 문자열로 시작한다는 것을 의미하며, 이는 URL 경로와 일치하는 것으로 이해될 수 있습니다. nginx는 URL을 인코딩하지 않으므로 요청은 규칙에 따라 결정될 수 있는 /static/20%/aa입니다^~ /static/ /aa는 일치합니다(공백에 주의하세요).
~ 의 시작은 대소문자 구분 정규 매칭을 의미합니다
~* 의 시작 대소문자를 구분하지 않는 일반 일치
!~ 및 !~*는 각각 대소문자를 구분하는 불일치 를 의미합니다. 대소문자를 구분하지 않는 정규 표현식
/ 과 일치하지 않으며 모든 요청이 일치됩니다.
여러 위치 구성의 경우 일치 순서는 다음과 같습니다. 참고용입니다):
첫 번째 일치 =, 그 다음 ^~, 파일에 있는 순서대로 일반 일치, 마지막으로 / 범용 일치입니다. 일치가 성공하면 일치가 중지되고 현재 일치 규칙에 따라 요청이 처리됩니다. 예를 들어 다음과 같은 일치 규칙이 있습니다.
location = / {
   #规则A
}
location = /login {
   #规则B
}
location ^~ /static/ {
   #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D
}
location ~* \.png$ {
   #规则E
}
location !~ \.xhtml$ {
   #规则F
}
location !~* \.xhtml$ {
   #规则G
}
location / {
   #规则H
}

그러면 효과는 다음과 같습니다. 다음과 같습니다:
http://localhost/와 같은 루트 디렉토리/에 액세스하면 규칙 A와 일치합니다
http:/에 액세스 /localhost/login은 규칙 B와 일치하고, http://localhost/register는 규칙 H
와 일치하며, http://localhost/static/a.html을 방문하면 규칙 C와 일치합니다.
http://localhost/a.gif를 방문하면 http://localhost/b.jpg는 규칙 D와 규칙 E와 일치하지만 규칙 D의 순서가 우선합니다. E는 작동하지 않으며 http://localhost/static/c.png는 규칙 C
에 먼저 일치합니다. E는 일치하지만 규칙 E는 대문자와 소문자를 구분하지 않기 때문에 규칙 D는 일치하지 않습니다.
http://localhost/a.xhtml에 액세스하면 규칙 F 및 규칙 G와 일치하지 않습니다. http://localhost/a.XHTML은 크기가 아니기 때문에 규칙 G와 일치하지 않습니다. 민감하다. Rule F와 Rule G는 매칭규칙을 따르지만 매칭되지 않는 소거법에 속하므로, 실제 응용에서 어디에 활용될지 생각해 보세요.
http://localhost/category/id/1111에 액세스하면 결국 규칙 H와 일치하게 됩니다. 위의 규칙 중 어느 것도 일치하지 않으므로 nginx는 요청을 백엔드 애플리케이션 서버로 전달해야 합니다. 현재 FastCGI(php), tomcat(jsp), nginx 등이 방향성 프록시 서버로 존재합니다.
그래서 실제 사용에서는 개인적으로 다음과 같이 일치하는 규칙 정의가 세 개 이상 있다고 생각합니다.
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
    proxy_pass http://tomcat:8080/index
}
 
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}
 
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
    proxy_pass http://tomcat:8080/
}

테스트되지 않은 기타 정보:
3. ReWrite 구문
마지막 – 기본적으로 이 플래그를 사용합니다.
break - Rewirte를 중단하고 더 이상 일치를 계속하지 않습니다.
redirect - 임시 리디렉션의 HTTP 상태 302를 반환합니다.
permanent - 영구 리디렉션의 HTTP 상태 301을 반환합니다.
참고 : last와 break의 가장 큰 차이점은 입니다.
- break는 현재 위치의 다시 쓰기 감지를 종료하고 더 이상 위치 일치를 수행하지 않습니다. 마지막은 현재 위치의 다시 쓰기 감지를 종료하지만 계속해서 위치를 다시 시도합니다. 블록 재작성 규칙 일치 및 처리
1. 다음 표현식을 사용하여 판별할 수 있습니다.
-f 및 !-f는 파일이 존재하는지 판별하는 데 사용됩니다.
-d 및 !-d는 데 사용됩니다. 디렉토리가 존재하는지 확인
-e 및 !-e는 파일 또는 디렉토리가 존재하는지 확인하는 데 사용됩니다.
-x 및 !-x는 파일이 실행 가능한지 확인하는 데 사용됩니다
2. 판단에 사용할 수 있는 전역 변수
$args #이 변수는 요청 라인의 매개변수와 동일합니다.
$content_length #요청 헤더의 콘텐츠 길이 필드입니다.
$content_type #요청 헤더의 Content-Type 필드입니다.
$document_root #현재 루트 지시문에 지정된 값이 요청됩니다.
$host #요청 호스트 헤더 필드, 그렇지 않으면 서버 이름입니다.
$http_user_agent #클라이언트 에이전트 정보
$http_cookie #클라이언트 쿠키 정보
$limit_rate #이 변수는 연결 속도를 제한할 수 있습니다.
$request_body_file #클라이언트 요청 본문 정보의 임시 파일명입니다.
$request_method #클라이언트가 요청한 작업으로, 일반적으로 GET 또는 POST입니다.
$remote_addr #클라이언트의 IP 주소입니다.
$remote_port #클라이언트 포트입니다.
$remote_user #Auth Basic Module에서 검증된 사용자 이름입니다.
$request_filename #루트 또는 별칭 지시어와 URI 요청에 의해 생성된 현재 요청의 파일 경로입니다.
$query_string # $args와 동일합니다.
$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와 동일합니다. 예: http://localhost:88/test1/test2/test.php
$host: localhost
$server_port:88
$request_uri: http ://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:nginx/html
$request_filename:D:nginx/html /test1/test2/test.php
4. 구문 리디렉션
여러 디렉터리를 매개변수로 변환
abc.domian.com/sort/2 => sort&name=abc&id=2
1. if ($host ~* (.*).domain.com) {
2.세트 $sub_name $1
3. ^/sort/(d+)/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;4. 
}디렉터리 교환/123456/xxxx -> /xxxx?id=123456

1.
다시 작성 ^/(d+)/(.+)/ /$2?id=$1 last;예를 들어, 다음 설정 nginx는 사용자가 다음을 사용할 때 /nginx-ie 디렉토리로 리디렉션됩니다. 즉 다음:
1. 
if ($http_user_agent ~ MSIE) {2. 
다시 작성 ^(.*)$ /nginx-ie/$1 휴식;3. 
} 디렉토리에 "/"가 자동으로 추가됩니다.
1. 
(-d $request_filename){2. 
다시 작성 ^/(.*)([^/])$ http://$host/$1$2/ 영구;3. 
}htaccess 금지
1. 
위치 ~/.ht {2. 
모두 거부;3.
}다중 디렉토리 금지
1.  
위치 ~ ^/(cron|템플릿)/ {2. 
모두 거부;3. 
휴식;4. 
}/data로 시작하는 파일 금지/data/;
아래의 다중 레벨 디렉터리에서 .log.txt에 대한 요청 및 기타 요청을 금지할 수 있습니다.
1. 
위치 ~ ^/데이터 {2. 
모두 거부;
3. }
단일 디렉터리 차단
.log.txt를 차단할 수 없음 요청 가능
1.  위치 /searchword/cron/ {
2.  모두 거부;
3. }
단일 파일 차단
1.  위치 ~ /data/sql/data.sql {
2.  모두 거부;
3. }
favicon.ico 및 robots.txt의 만료 시간을 설정합니다.
여기서 favicon.ico는 99일, robots.txt는 7일이며 404 오류 로그는 없습니다. 녹화
1. 위치 ~(favicon.ico) {
2.  log_not_found off;
3. 만료 99d;4. 
break;5. 
}6. 위치 ~(robots.txt) {
8.
log_not_found off;9. 만료 7d;
10. break;
11. 특정 파일, 여기서는 600초이고 액세스 로그가 기록되지 않습니다1. 
위치 ^~ /html/scripts/loadhead_1.js {2. 
접속_로그오프;
3. ~ 600;
5. break;
6.  }
파일 안티 핫링크 및 만료 시간 설정여기서 반환되는 412는 사용자 정의 http 상태 코드이며 기본값은 403이며 이는 올바른 핫링크 요청을 찾는 데 편리합니다. "rewrite ^/ http://leech.c1gstudio.com/leech.gif;" 핫링크 방지 그림 표시 "access_log off;" 액세스 로그를 기록하지 말고 스트레스를 줄이세요 "3d 만료" 3일 동안의 모든 브라우저 파일 캐시
1.



위치 ~* ^.+.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
2.  valid_referers 차단된 항목 없음 *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194;
3. if ($invalid_referer) {
4.  다시 작성 ^/ http://leech.c1gstudio.com/leech.gif;
5.  412 반환;
6.  휴식;
7. }
8.  접속_로그오프;
9. 루트 /opt/lampp/htdocs/web;
10. 3d 만료;11. break;
12. }
고정 IP로만 사이트 접속을 허용하고 비밀번호를 추가하세요
1. 루트 /opt/htdocs/www;
2. 
허용 208.97.167.194;3. 
허용 222.33.1.2;4. 
허용 231.152.49.4;
5. 거부 모두;
6. auth_basic "C1G_ADMIN";
7. auth_basic_user_file htpasswd;
다단계 디렉터리의 파일을 하나의 파일로 변환하여 SEO 효과 향상
/job-123-456-789.html은 /job/123/456/을 가리킵니다. 789.html
1. 다시 작성 ^/job-([0-9]+)-([0-9]+)-([0-9]+).html$ /job/$1/$2/jobshow_$3.html 마지막;
루트 디렉터리의 폴더를 두 번째 수준 디렉터리로 지정
예를 들어 /shanghaijob/은 /area/shanghai/를 가리킵니다.
마지막을 영구로 변경하면 브라우저 주소 표시줄은 /location/shanghai/
1.                                                ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;위 예의 문제점은 /에 액세스할 때 / 상하이 일치하지 않음
1. 
다시 작성 ^/([0-9a-z]+)job$ /area/$1/ last;2. 
다시 쓰기 ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;이 방법으로 /shanghai에도 액세스할 수 있습니다. 하지만 페이지에서는 상대 링크를 사용할 수 없습니다. 예를 들어 ./list_1.html의 실제 주소는 /area /shanghia/list_1.html이며, 이는 /list_1.html이 되어 액세스할 수 없게 됩니다.

그러면 자동 점프를 추가하면 작동하지 않습니다(-d $request_filename) 실제 디렉터리여야 한다는 조건이 있는데, 제 재작성은 그렇지 않습니다. 그래서 효과가 없습니다

1. 
(-d $request_filename){2. 
다시 작성 ^/(.*)([^/])$ http://$host/$1$2/ 영구;3. 
}이유를 알면 더 쉬울 테니 수동으로 점프하도록 해주세요
1. 
다시 작성 ^/([0-9a-z]+)job$ /$1job/ 영구;2. 
다시 작성 ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;파일 및 디렉터리가 존재하지 않는 경우 리디렉션:
1. 
인 경우 (!-e $request_filename) {2. 
proxy_pass http://127.0.0.1;3. 
}도메인 이름 점프
1. 서버
2.  {
3.   듣다 server_name jump.c1gstudio.com;
5. index index.html index.htm index.php;
6.                                         /opt/lampp/htdocs/www;
7.                                          다시 작성 ^/ http://www.c1gstudio.com/;8.                                              접속_로그오프;
9. }
다중 도메인 이름 리디렉션1.
 server_name www.c1gstudio.com www.c1gstudio.net;2.
  index index.html index.htm index.php;
3. ~ ($host ~ "c1gstudio.net") {
5. 다시 작성 ^(.*) http://www.c1gstudio.com$1 영구;
6. }
3단계 도메인 이름 점프1.
 if ($http_host ~* "^(.*).i.c1gstudio.com$") {2.
 다시 작성 ^(.*) http://top.yingjiesheng.com$1;3.
 break;
4. }
도메인 이름 미러
1. 서버
2.  {
3.                       80;
4.                  > >            하지만 하지만                                     index index.html index.htm index.php;6.
                                        /opt/lampp/htdocs/www;7.                                           다시 작성 ^/(.*) http://www.c1gstudio.com/$1 마지막;
8.                                                  접속_로그오프;
9. }
위 내용은 다양한 측면을 포함하여 nginx의 위치 구성을 소개하고 있어 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.