어떤 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!