![Nginx 지도 지시문이 규칙과 일치하지 않습니다.](https://rvso.com/image/697395/Nginx%20%EC%A7%80%EB%8F%84%20%EC%A7%80%EC%8B%9C%EB%AC%B8%EC%9D%B4%20%EA%B7%9C%EC%B9%99%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
이 nginx 구성 파일이 있습니다.
map $request_uri $new_uri {
default DEFAULT;
/shell http://shell.com;
/lol http://lol.com;
}
map $request_uri $ret_code {
default 301;
/shell 301;
/lol 302;
}
server {
listen 80;
server_name TestDomain.com www.TestDomain.com;
location / {
add_header X-request_uri $request_uri;
add_header X-new_uri $new_uri;
add_header X-return_code $ret_code;
if ($new_uri = "DEFAULT") {
return 301 https://ashfame.com$request_uri;
}
if ($ret_code = 301) {
return 301 $new_uri;
}
if ($ret_code = 302) {
return 302 $new_uri;
}
}
}
map 지시문은 전혀 작동하지 않으며 기본값으로 정의된 대로 기본값을 지정합니다.
예를 들어:
$ curl -I testdomain.com/lol
HTTP/1.1 301 Moved Permanently
Server: nginx/1.10.0 (Ubuntu)
Date: Sun, 22 Jan 2017 20:04:06 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://ashfame.com/lol
X-request_uri: /lol
X-new_uri: DEFAULT
X-return_code: 301
/lol
$new_uri
as http://lol.com
및 $ret_code
as를 설정해야 302
하지만 헤더를 보면 X-
매핑에 지정된 기본값을 사용하는 것뿐입니다.
일주일 전에 나는 이와 동일한 nginx 구성이 작동하고 그 이후로 아무런 변화가 없었습니다. 우분투의 자동 보안 업그레이드가 켜져 있지만 nginx가 업데이트되지 않은 것 같습니다. 달리기 v1.10.0
. 이것이 작동을 멈춘 이유를 실제로 지적할 수는 없습니다.
편집: 다른 VPS, 동일한 nginx 버전에서 동일한 구성을 테스트했는데 올바르게 작동합니다. 이제 이 문제를 어떻게 해결할 수 있나요?
답변1
문제를 알아냈습니다. 나는 각 도메인에 대해 이러한 구성 파일을 여러 개 가지고 있었고 맵은 http 컨텍스트에서 정의되었으므로 마지막 파일은 변수 값을 덮어쓰고 있었습니다. 변수가 고유하도록 각 구성 파일에 변수 이름 접미사를 추가하여 문제를 해결했습니다.
map $request_uri $new_uri_5 {
default DEFAULT;
/shell http://shell.com;
/lol http://lol.com;
}
map $request_uri $ret_code_5 {
default 301;
/shell 301;
/lol 302;
}
server {
listen 80;
server_name TestDomain.com www.TestDomain.com testdomain.com www.testdomain.com;
location / {
add_header X-request_uri $request_uri;
add_header X-new_uri $new_uri_5;
add_header X-return_code $ret_code_5;
if ($new_uri_5 = "DEFAULT") {
return 301 https://ashfame.com$request_uri;
}
if ($ret_code_5 = 301) {
return 301 $new_uri_5;
}
if ($ret_code_5 = 302) {
return 302 $new_uri_5;
}
}
}
5는 내 시스템에 있는 이 특정 도메인의 ID입니다.
답변2
Nginx 1.12.2에서 동일한 문제가 발생했습니다. 지도 지시문은 와 같은 가장 단순하고 사소한 패턴이라도 패턴과 일치하지 않으며 /
항상 기본값을 사용했습니다.
$uri
이 문제는 매핑에서 변수를 사용하여 발생하는 것으로 확인되었습니다 . 일부 Nginx 구성은 패턴 불일치를 유발하는 접두사를 $uri
앞에 추가하여 원래 값을 암시적으로 수정했습니다 . /index.php
이러한 동작은 $uri
의도적으로 설계된 것이며 두 요소 간의 정확한 구별은 다음과 같습니다.$request_uri
그리고 $uri
변수.
수정 사항은 Nginx 구성에서 URI 변수를 바꾸는 것이었습니다.
map $uri $result_var {
# ...
}
다음과 함께:
map $request_uri $result_var {
# ...
}