nginx 구성에서 $ uri에서 위치 블록을 제거하는 방법은 무엇입니까?


16

ngix conf 파일에서 $ uri 변수의 일부로 위치 블록을 포함하는 것 외에는 제대로 작동하는 다시 쓰기가 있습니다. 위치 블록 다음의 경로 만 원합니다. 현재 설정 코드는 다음과 같습니다

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

http://localhost/cargo/testpage리디렉션 URL 예제를 사용하면 PHP 파일에서 수신 한 "_REWRITE_COMMAND"매개 변수의 값은 "/ cargo / testpage"입니다. 위치 블록을 제거하고 $ uri로 "testpage"를 갖습니다.

$ uri를 나누고 $ 1 $ 2 등을 사용하여 새 변수에 할당하는 정규식 구문이 있다고 확신하지만 재 작성의 일부가 아닌 정규 표현식을 사용하여 변수 할당을 수행하는 예제를 찾을 수 없습니다 성명서. 나는 몇 시간 동안 찾고 노력했지만이 마지막 단계를 지나칠 수없는 것 같습니다.

또한 응용 프로그램 코드 에서이 문제를 해결할 수는 있지만 nginx conf에서 수정하려고하는 이유는 Apache에서도 실행되므로 호환성 문제 때문입니다. 또한 실제로 해킹 방법을 알아 냈지만 파일 존재 여부를 확인하기위한 "if"문이 포함되어 있으며 설명서에서 구체적 으로 그렇게하지 말라고 합니다.

답변:


18

주위를 둘러 보면 캡처와 함께 정규 표현식 위치를 사용하는 것이 가장 쉽다고 생각합니다. 당신의 모범을 채택하면 나는 다음과 같이 끝납니다.

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}

아아, 누군가가 당신에게 그것을 지적하면 너무 간단합니다! 루트 URL 재 작성을 올바른 위치로 처리하기 위해 약간의 수정이 필요했습니다. 이 의견에서 서식을 지정할 수 없으므로 질문에 답을 썼습니다. 남은 유일한 경고는 php 블록이 이제이 위치 블록 위에 있거나 무한 리다이렉션 루프가 생성된다는 것입니다. 그 일이 발생하지 않도록 다른 방법이 있는지 확실하지 않습니까?
Jason

정규 표현식 및 비정규 위치의 순서를 읽는 것이 좋습니다. 나는 보통 어떤 위치에서 모든 위치를 정규 표현식으로 바꾸는 것으로 설정합니다. 그러면 순서는 일치의 특이성 대신 구성 파일의 순서에 따라 결정되기 때문입니다.
Theuni

멋진 감사합니다 ./cargo/(index.php 이외의 항목)와 일치하는 경우 정규식을 더 좋게 만드는 것이 무엇인지 상상하고 무한 무한 쓰기 루프로 인한 서버 오류를 방지합니다.
Jason

3

나는 나를 위해 일한 다른 것을 발견했다. (Gunicorn을 사용하고 있으므로 전달할 항목을 선택할 수 없음)

당신은 도망 갈 수 있어야합니다

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

1

Node JS로 마이크로 서비스 또는 API에 추가하기 위해 고군분투하는 사람들을 위해 다음을 사용하여 api서버의 URL에서 제거 했습니다.

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.