
nginx 설정에 어려움을 겪고 있습니다. 존재하지 않는 한 (예: 또는 ) server
모든 요청이 로 이동하도록 하는 블록이 있습니다 .index.php?tags=$uri
$uri
index.php?a=b
/?a=b
나는 기대한다:
try_files $uri index.php?tags=$uri;
하지만 그건 너무 간단할 것 같아요. /?a=b
분명히 발견되지 않은 에서는 작동하지 않으므로 다음으로 연결됩니다.index.php?tags=/
아마도 내가 명시적으로 를 포함한다면 index
이는 타당할 것입니다.
index index.php;
아니요. 주사위가 없습니다. 전반적으로 동일한 정확한 결과.
또한 $args
, $request_uri
또는 조합도 없습니다. 또한 그렇지 않습니다.
try_files $request_uri/index.php $request_uri index.php?tags=$request_uri; // now I'm just guessing
아파치는 내가 항상 의미하는 바를 어떻게든 알고 있었습니다. nginx는 왜 안되나요? 다음 리디렉션을 원합니다( redirect
또는 제외 if
).
/ => /index.php
/index.php => /index.php
/index.php?a=b => /index.php?a=b
/?a=b => /index.php?a=b
/foo => /index.php?tags=foo (or /index.php?tags=/foo)
/foo/bar => /index.php?tags=foo/bar (or /index.php?tags=/foo/bar)
/foo?bar=yes => /index.php?tags=/foo%3Fbar%3Dyes
리디렉션될 때 쿼리 문자열이 인코딩되기를 원하지만 경로는 그렇지 않지만 실제로는 그렇게 중요하지 않습니다.
(저는 또한 $uri와 $request_uri의 실제적인 차이점을 이해하지 못합니다. 그들은 절반의 시간을 동일한 작업을 수행하는 것 같습니다. 그러나 그것은 다른 날에 대한 것입니다.)
정말 감사합니다.
답변1
다음 구성 조각을 사용하여 원하는 결과를 얻었습니다.
location = / {
index index.php;
}
location / {
try_files $uri /index.php?tags=$request_uri;
}
try_files
... 파일을 시도합니다. 그걸로 검색하면 /
같은 이름의 파일을 검색하게 되는데, '인덱스 파일 찾기'로 해석되지 않습니다. index
그 일을 합니다. 따라서 이 특별한 경우를 기본 대체 위치와 분리해야 합니다.
가장 좋은 부분은 마지막 소원입니다. 인수는 필요하지 않기 때문에 인코딩되지도 않습니다(어쨌든 다음의 모든 것은 인수이므로 URI의 첫 번째 물음표만 관련됩니다).
사용에 주의하세요$request_uri
(인수와 함께 요청된 URI를 포함하지만 정규화/정리하지는 않음)$uri
(URI를 정리하고 인수를 제거합니다). 따라서 다음과 같이 끝날 수 있습니다.
///foo?bar=yes => index.php?tags=///foo?bar=yes
당신이 그것에 대해 생각한다면, 당신은 사용할 수 있습니다$uri
와 결합하여$args
:
location = / {
index index.php;
}
location / {
try_files $uri /index.php?tags=$uri?$args;
}
생산:
///foo?bar=yes => index.php?tags=/foo?bar=yes