1. 정규 표현식 일치, 여기서 다음과 같다: * ~ 대문자 구별 매칭입니다 * ~* 대문자 구분 없는 매칭입니다 * !~와 !~*는 각각 대소문자 구분과 대소문자 구분 불일치입니다 2. 파일과 디렉터리가 일치하며, 다음과 같습니다: * -f와 !-f는 파일이 존재하는지 판단하는 데 사용됩니다 * -d와 !-d는 디렉터리가 존재하는지 판단하는 데 사용됩니다. * -e와 !-e는 파일이나 디렉터리가 존재하는지 판단하는 데 사용됩니다 * -x와 !-x는 파일이 실행 가능한지 여부를 판단하는 데 사용됩니다 3. 재작성 명령어의 마지막 매개변수는 플래그 마크이며, 다음과 같이 표시됩니다: 1.last는 apache의 [L] 표시와 동등하며, 이는 다시 쓰기를 의미합니다. 2. 브레이크 이 규칙의 매칭이 완료되면 매칭이 종료되고 이후 규칙들은 더 이상 매칭되지 않습니다. 3.redirect는 302 임시 리디렉션을 반환하며, 브라우저 주소는 점프 후 URL 주소를 표시합니다. 4.permanent 반환 301 영구 리다이렉션, 브라우저 주소는 점프 후 URL 주소를 표시합니다.
URI 재작성을 위해 라스트 앤 브레이크를 사용하며, 브라우저 주소 표시줄은 변경되지 않습니다. 그리고 두 가지 사이에 약간의 차이가 있는데, 별칭 명령어는 반드시 마지막으로 표시해야 합니다; proxy_pass 지시를 사용할 때는 break 태그를 사용해야 합니다. 이 재작성 규칙에서 마지막 태그가 실행되면 서버{......}에 표시됩니다 태그는 요청을 재시작하고, 브레이크 태그는 규칙 매칭이 완료된 후 매치를 종료합니다. 예를 들어, /photo/123456 같은 URL을 /path/to/photo/12/1234/123456.png로 리디렉션하면 "/photo/([0-9]{2})([0-9]{2})([0-9]{2})" 다시 쓰기 "/path/to/photo/$1/$1$2/$1$2$3.png ;
4. NginxRewrite 규칙
1. 브레이크 명령 사용 환경: 서버, 위치, if; 이 지시는 현재 규칙 집합을 완성하며 더 이상 재작성 지시를 처리하지 않습니다.
2. 만약 지시적이다 사용 환경: 서버, 위치 이 명령어는 조건이 충족되는지 확인하고, 충족되면 컬리 괄호 안에서 해당 문장을 실행하는 데 사용됩니다. If 명령어는 중첩을 지원하지 않으며, 여러 조건 && 및 || 치료.
3. 명령 반환 문법: returncode ; 사용 환경: 서버, 위치, if; 이 명령어는 규칙 실행을 종료하고 클라이언트에 상태 코드를 반환하는 데 사용됩니다. 예시: 방문한 URL이 ".sh" 또는 ".bash"로 끝나면 403 상태 코드가 반환됩니다 위치 ~ .*\. (슛)?$
{ 리턴 403;
}
4. 명령 재작성 구문론: rewriteregex 교체 플래그 사용 환경: 서버, 위치, 만약 이 명령어는 표현식을 기반으로 URI를 리디렉션하거나 문자열을 수정합니다. 명령어는 구성 파일의 순서대로 실행됩니다. 표현식 재작성은 상대 경로에만 유효하다는 점에 유의하세요. 호스트명을 페어링하고 싶다면, 예를 들어 아래와 같은 if 문들을 사용해야 합니다: if( $host ~* www\( *) )
{ $host_without_www $1 설정; rewrite ^(.*)$ http://$host_without_www$1permanent;
}
5. 명령어 설정 문법: setvariable value; 기본값: 없음; 사용 환경: 서버, 위치, if; 이 지시는 변수를 정의하고 값을 할당하는 데 사용됩니다. 변수의 값은 텍스트, 변수, 또는 텍스트 변수들의 합집합일 수 있습니다. 예시: set$varname "안녕 세상";
6.Uninitialized_variable_warn 지침 문법: uninitialized_variable_warnon |off 사용 환경: http, 서버, 위치, 만약 이 명령어는 초기화되지 않은 변수에 대한 경고 메시지를 켜고 끄는 데 사용되며, 기본값은 켜져 있습니다.
5. Nginx Rewrite 규칙 작성 예시 1. 접근한 파일과 디렉터리가 존재하지 않을 때, 특정 PHP 파일로 리디렉션합니다 if( !-e $request_filename )
{ rewrite ^/(.*)$ index.php 마지막;
}
2. 디렉터리 교환 /123456/xxxx ====> /xxxx?id=123456 rewrite ^/(\d+)/(.+)/ /$2?id=$1 마지막;
3. 클라이언트가 IE 브라우저를 사용 중이라면, /ie 디렉터리로 리디렉션됩니다 if( $http_user_agent ~ MSIE)
{ rewrite ^(.*)$ /ie/$1 구분;
}
4. 여러 디렉터리에 대한 접근 차단 위치 ~ ^/(크론|템플릿)/
{ 모두 부인하라; 브레이크;
}
5. /data로 시작하는 파일 접근 차단 위치 ~ ^/데이터
{ 모두 부인하라;
}
6. 파일 접미사 이름이 .sh, .flv, .mp3 있는 파일 접근을 금지합니다 위치 ~ .*\. (sh|flv|mp3)$
{ 리턴 403;
}
7. 특정 유형의 파일에 대해 브라우저 캐시 시간을 설정하세요 위치 ~ .*\. (gif|jpg|jpeg|png|bmp|swf)$
{ 만료 30일;
} 위치 ~ .*\. (js|css)$
{ 만료 시간은 1시간;
}
8. favicon.ico와 robots.txt의 만료 시간을 설정; 여기서는 favicon.ico 99일, robots.txt 7일이며, 404 오류 로그는 기록되지 않습니다 위치 ~(favicon.ico) { log_not_found 떠나고; 만료 99일; 브레이크;
} 위치 ~(robots.txt) { log_not_found 떠나고; 만료 7펜스; 브레이크;
}
9. 특정 문서의 만료 시간을 설정; 이 시간은 600초이며, 접근 로그는 기록되지 않습니다 위치 ^~ /html/scripts/loadhead_1.js { access_log 떠나고; 루트 /opt/lampp/htdocs/web; 만료 600; 브레이크;
}
10. 안티핫링크 파일 및 유효 기간 설정 여기 Return412는 맞춤형 HTTP 상태 코드로, 기본값은 403으로 설정되어 올바른 핫링크 요청을 찾는 데 편리합니다 "다시 쓰기 ^/ ; "안티 핫링크 이미지 보여줘 "access_log 나가;" 접근 기록이 없어 스트레스를 줄여줍니다 "만료된 3D" 모든 파일에 대해 3일치 브라우저 캐시
위치 ~*^.+\. (jpg|jpeg|gif|png|swf|rar|zip|CSS|js)$ { valid_referers 차단되지 않음 *.xx.com*.xx.net localhost 208.97.167.194; 만약 ($invalid_referer) { 재작성 ^/ ; 리턴 412; 브레이크;
} access_log 떠나고; 루트 /opt/lampp/htdocs/web; 만료 3펜스; 브레이크;
}
11. 비밀번호가 있는 고정 IP만 웹사이트 접속을 허용하세요
루트 /opt/htdocs/www; 허용 208.97.167.194; 허용 222.33.1.2; 허용 231.152.49.4; 모두 부인하라; auth_basic "C1G_ADMIN"; auth_basic_user_file htpasswd;
12다단계 디렉터리의 파일을 하나의 파일로 변환하여 SEO 효과를 향상시키기
/job-123-456-789.html 指向/job/123/456/789.html
rewrite^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html 마지막;
13. 파일 및 디렉터리가 존재하지 않을 경우 리디렉션:
만약 (!-e $request_filename) { proxy_pass http://127.0.0.1;
}
14. 루트 디렉터리의 폴더를 레벨 2 디렉터리로 지정하세요 예를 들어, /shanghaijob/은 /area/shanghai/를 가리킵니다 만약 마지막 이름이 영구로 바뀌면 브라우저 주소 표시줄이 /location/shanghai/로 표시됩니다 rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last; 위 예시의 문제는 /shanghai에 접속할 때 이 정보가 일치하지 않는다는 점입니다 rewrite ^/([0-9a-z]+)job$ /area/$1/ 마지막; rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last; 이 방법/상하이도 접근 가능하지만, 페이지에 있는 관련 링크는 제공되지 않습니다. ./list_1.html 실제 주소가 /area/shanghia/list_1.html 되면 /list_1.html가 되어 접근 불가능해집니다. 그럼 자동 점프를 추가할 수 없어요 (-d $request_filename)은 실제 디렉터리여야 한다는 조건이 있는데, 제 리라이트는 그렇지 않아 효과가 없습니다 만약 (-d $request_filename){ 리라이트 ^/(.*)([^/])$ http://$host/$1$2/permanent;
} 이유를 알면 쉽게 할 수 있으니, 수동으로 점프할게요 Rewrite ^/([0-9A-Z]+)Job$ /$1Job/Permanent; rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
15. 도메인 이름 점프 서버
{ 듣기 80; server_name jump.linuxidc.com; 지수 index.html index.htm index.php; 루트 /opt/lampp/htdocs/www; 재작성 ^/ http://www.xx.com/; access_log 떠나고;
}
16. 다중 영역 선동 server_name www.xx.comwww.xx.com; 지수 index.html index.htm index.php; 루트 /opt/lampp/htdocs; if ($host ~ "linuxidc\.net") { 재작성 ^(.*) http://www.xx.com$1permanent;
}
6. nginx 전역 변수 arg_PARAMETER #这个变量包含GET请求中, 변수 PARAMETER가 존재한다면. args #这个变量等于请求行中 (GET request) 매개변수, 예를 들어 foo=123&bar=blahblah; binary_remote_addr #二进制的客户地址. body_bytes_sent #响应时送出的body字节数数量. 이 데이터는 연결이 끊겨도 정확합니다. content_length #请求头中的Content 길이의 필드. content_type #请求头中的Content형 필드. cookie_COOKIE #cookie COOKIE 변수의 값입니다 document_root #当前请求在root指令中指定的值. document_uri #与uri相同. 호스트 #请求主机头字段, 그렇지 않으면 서버 이름이 필요합니다. 호스트네임은 gethostname에서 반환된 TheMachine 호스트네임으로 #Set http_HEADER is_args #如果有args参数 이 변수는 "?"이고, 그렇지 않으면 """, null 값입니다. http_user_agent #客户端agent信息 http_cookie #客户端cookie信息 limit_rate #这个变量可以限制连接速率. query_string #与args相同. request_body_file #客户端请求主体信息的临时文件名. request_method #客户端请求的动作 보통 GET이나 POST를 선택해요. remote_addr #客户端的IP地址. remote_port #客户端的端口. remote_user #已经经过Auth 기본 모듈로 인증된 사용자 이름입니다. request_completion #如果请求结束, OK로 설정해. 요청이 완료되지 않았거나 요청이 요청 체인의 마지막이 아닐 때 빈 공간입니다. request_method #GET或POST request_filename #当前请求的文件路径 루트 또는 별칭 명령어와 URI 요청에 의해 생성됩니다. request_uri #包含请求参数的原始URI, 호스트 이름은 포함하지 않습니다. 예를 들어, "/foo/bar.php?arg=baz". 수정 불가. 스킴 #HTTP方法(예: http, https). server_protocol #请求使用的协议 보통 HTTP/1.0이나 HTTP/1.1입니다. server_addr #服务器地址, 이 값은 시스템 호출이 완료된 후에 결정할 수 있습니다. server_name #服务器名称. server_port #请求到达服务器的端口号.
7. 아파치와 Nginx 규칙 간의 대응 Apache의 RewriteCond는 Nginx의 조건과 일치합니다. Apache의 RewriteRule은 Nginx의 리라이트에 대응합니다 Apache의 [R]는 Nginx의 리디렉션에 해당합니다 아파치어에서 [P]는 Nginx에서 마지막에 해당합니다. 아파치어의 [R,L]는 Nginx의 리다이렉션에 해당합니다 아파치어 [P,L]는 Nginx의 마지막 문자와 일치합니다 아파치어의 [PT,L]는 Nginx의 마지막 언어와 일치합니다
예를 들어, 지정된 도메인 이름이 이 사이트에 접근하도록 허용하고 항상 다른 도메인 이름으로 전환 www.xx.com 아파치: RewriteCond %{HTTP_HOST} !^(.*?) \.aaa\.com$[NC] RewriteCond %{HTTP_HOST} !^localhost$ RewriteCond %{HTTP_HOST}!^192\.168\.0\. (.*?) $ RewriteRule ^/(.*)$ http://www.xx.com[R,L]
Nginx: if( $host ~* ^(.*)\.aaa\.com$ )
{ $allowHost '1'로 설정;
} if( $host ~* ^localhost)
{ $allowHost '1'로 설정;
} if( $host ~* ^192\.168\.1\(. *?) $ )
{ $allowHost '1'로 설정;
} if( $allowHost !~ '1' )
{ 리라이트 ^/(.*)$ http://www.xx.comredirect ;
}
|