어떤 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>는 무엇을 출력할까요? 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!