>  기사  >  운영 및 유지보수  >  nginx 위치 지시문에 대한 자세한 설명

nginx 위치 지시문에 대한 자세한 설명

藏色散人
藏色散人앞으로
2020-01-29 13:24:023122검색

nginx 위치 지시문에 대한 자세한 설명

어떤 nginx 변수가 위치와 일치하나요?

$request_uri$request_uri

location的匹配种类有哪些?

=开头表示精确匹配

^~ 开头,注意这不是一个正则表达式(是提升优先级的字符串匹配)–它的目的是优先于正则表达式的匹配。如果该location是最佳匹配,则不再进行正则表达式检测。

~ 开头表示区分大小写的正则匹配;

~* 开头表示不区分大小写的正则匹配

!~ && !~*:表示区分大小写不匹配的正则和不区分大小写的不匹配的正则

字符串匹配

/通用匹配, 如果没有其它匹配,任何请求都会匹配到

location搜索顺序

首先精确匹配 =

其次匹配 ^~

再其次按照配置文件的顺序进行正则匹配

最后是交给/进行通用匹配

注意:

当有匹配成功时,立刻停止匹配,按照当前匹配规则处理请求

特别注意:字符串匹配优先搜索,但是只是记录下最长的匹配 ,然后继续搜索正则匹配,如果有正则匹配,则命中正则匹配,如果没有正则匹配,则命中最长的字符串匹配。 ( 如果 ^~ 是最长的匹配,则会直接命中,停止搜索正则 )

精确匹配

location = /images/test.png {
    echo 'config1';
}
location  /images/test.png {
    echo 'config2';
}
location \/images\/test\.png$ {
    echo 'config3';
}

如果此时请求 http://127.0.0.1/images/test.png 会输出什么呢?

输出 config1, 毋容置疑,精确匹配优先级最高!

精确匹配的特殊情况

location = / {
    index index.html;
}
location / {
    echo 'config2';
}

此时是输入http://127.0.0.1 会输出什么呢?

是输出 config2, 怎么精确匹配的优先级不灵了呢?

是这样的,精确匹配还是起作用了,请求目录(非具体文件),nginx会将请求内部定向到index文件,

既此时真正的请求是http://127.0.0.1/index.html, 这是 config2则被命中!

所以精确匹配不要用来匹配 /

字符串搜索与正则搜索

location /images/test.png {
    echo 'config1';
}
location ^~ /images/ {
    echo 'config2';
}
location ~ \/images\/test\.png$ {
    echo 'config3';
}
location ~ \/images\/ {
    echo 'config4';
}

如果此时请求 http://127.0.0.1/images/test.png 会输出什么呢?

当然是 config3,正则命中

(虽然 config1 为最长匹配的字符串,此时只做记录,后面还要搜索正则匹配,则config3正则匹配命中),

仔细观察可以发现config4也被匹配成功了,但是正则的匹配顺序是按照location的定义顺序匹配的,所以config3命中.

字符串匹配优先级的提升( ^~ )

location /images/ {
    echo 'config1';
}
location ^~ /images/test.png {
    echo 'config2';
}
location ~ /images/test\.png$ {
    echo 'config3';
}
location ~ \/images\/ {
    echo 'config4';
}

如果此时请求 http://127.0.0.1/images/test.png 会输出什么呢?

当然是config2, 首部匹配命中

(因为字符串匹配是优先搜索的,此时发现config2 为最长的字符串匹配且为^~匹配方式,所以停止搜索正则,直接命中!)

所以这里的 ^~

일치 유형은 무엇인가요?

=는 정확히 일치로 시작합니다.🎜🎜^~는 다음으로 시작합니다. , 이는 정규 표현식이 아니라는 점에 유의하십시오(우선 순위가 높은 문자열 일치). 이는 정규 표현식 일치보다 우선순위를 갖기 위한 것입니다. 위치가 가장 일치하는 경우 정규식 검색이 더 이상 수행되지 않습니다. 🎜🎜~ 는 대소문자를 구분하는 일반 일치로 시작합니다. 🎜🎜~* 는 대소문자를 구분하지 않는 일반 일치로 시작합니다🎜🎜!~ && !~* : 대소문자 구분 비일치 정규식 및 대소문자 구분 비일치 정규식을 나타냅니다.🎜🎜🎜문자열 일치🎜🎜🎜/범용 일치, 다른 일치 항목이 없으면 모든 요청은 🎜🎜🎜위치 검색 순서🎜🎜와 일치합니다. 🎜첫 번째 =와 정확하게 일치🎜🎜두 번째로 ^~와 일치🎜🎜그런 다음 구성 파일의 순서에 따라 일반 일치를 수행합니다.🎜🎜마지막으로 범용으로 넘겨줍니다. 일치 🎜🎜🎜참고: 🎜🎜🎜일치에 성공하면 일치가 즉시 중지되고 현재 일치 규칙에 따라 요청이 처리됩니다.🎜🎜특별 참고 사항: 문자열 일치가 먼저 검색되지만 가장 긴 일치만 검색됩니다. 기록된 후 정규 일치가 계속 검색됩니다. 정규 일치가 있으면 정규 일치가 적중되고, 정규 일치가 없으면 가장 긴 문자열 일치가 적중됩니다. (^~가 가장 긴 일치일 경우 직격타를 치고 정규식 검색을 중단합니다)🎜🎜🎜완전 일치🎜🎜rrreee🎜이때 요청하면 http://127.0.0.1/images/test.png code>는 무엇을 출력할까요? 🎜🎜<code>config1 출력, 의심할 바 없이 정확한 일치가 가장 높은 우선순위를 갖습니다! 🎜🎜완전 일치의 특별한 경우🎜rrreee🎜http://127.0.0.1를 입력하면 무엇이 출력되나요? 🎜🎜 config2의 출력인데 왜 정확한 일치 우선순위가 작동하지 않나요? 🎜🎜그렇습니다. 디렉토리(특정 파일 아님)를 요청하면 nginx는 내부적으로 요청을 인덱스 파일로 보냅니다. 🎜🎜이때 실제 요청은 http://127.0입니다. .0.1 /index.html, 이것은 config2이며 히트입니다!🎜🎜따라서 /🎜🎜문자열 검색과 일반 검색🎜rrreee🎜을 일치시키는 데 완전 일치를 사용하면 안 됩니다. http://127.0.0.1/images/test.png를 요청하면 무엇이 출력되나요? 🎜🎜물론 config3이고, 정규 매치가 히트🎜🎜 (config1이 가장 긴 매칭 문자열이지만 이때만 기록되고, 정규 매치는 나중에 검색할 것이므로 config3 정규 일치 히트),🎜🎜 주의 깊게 관찰하면 config4도 성공적으로 일치하지만 정규 일치 순서는 위치 정의 순서에 따라 일치하므로 config3 히트입니다.🎜🎜🎜문자열 일치 우선순위가 향상되었습니다(^~)🎜 🎜rrreee🎜이때 http://127.0.0.1/images/test.png를 요청하면 무엇이 출력될까요? 🎜🎜물론 config2이고 첫 번째 일치가 적중합니다🎜🎜(문자열 일치가 먼저 검색되기 때문에 config2가 가장 긴 문자열 일치이고 ^~ 일치 방법인 것으로 확인되므로 검색은 )🎜🎜여기서 ^~ 기호는 일반 일치에 앞서 문자열 일치의 우선순위를 높이기 위해 특별합니다.🎜🎜관련 권장 사항: "🎜 Nginx 튜토리얼🎜"🎜

위 내용은 nginx 위치 지시문에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제