Nginx에서 URL 매개변수 앞의 슬래시를 제거하는 방법

Nginx에서 URL 매개변수 앞의 슬래시를 제거하는 방법

URL에 관계없이 단일 PHP 파일을 실행하는 간단한 Nginx 사이트가 있습니다(일반적으로 제공되는 CSS/JS 파일 제외).

그러나 내가 무엇을 하든, 여러 브라우저로 테스트하든 GET/URL 매개변수를 포함할 때마다 ?. 예를 들어:

  • example.com?test=1=>로 리디렉션됩니다.example.com/?test=1
  • example.com/path?test=1=>로 리디렉션됩니다.example.com/path/?test=1

제가 현재 사용하고 있는 구성입니다

    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include                         fastcgi_params;
        fastcgi_index                   index.php;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_split_path_info         ^(.+\.php)(.*)$;
        fastcgi_param PATH_INFO         $fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }

이런 일이 발생하지 않도록 방지하는 방법을 아는 사람이 있나요?

답변1

나는 당신이 논의된 nginx 규칙 중 하나에 사로잡힌 것 같아요 여기즉 ...

위치가 슬래시 문자로 끝나는 접두사 문자열로 정의되고 요청이 Proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass 또는 grpc_pass 중 하나로 처리되는 경우 특수 처리가 수행됩니다. 이 문자열과 동일한 URI가 있지만 뒤에 슬래시가 없는 요청에 대한 응답으로 코드 301이 포함된 영구 리디렉션이 슬래시가 추가된 요청된 URI로 반환됩니다. 이를 원하지 않는 경우 URI와 위치의 정확한 일치를 다음과 같이 정의할 수 있습니다.

그리고 더 많은 논의가 있습니다. 귀하의 예제 URI는 실제로 첫 번째 위치 사양(명확히 슬래시로 끝남)에 의해 처리되므로 요청 URI에 슬래시가 추가된 것 같습니다.

location ~ .*$ { commands; }더 잘 작동할 수도 있는 위치 지정

관련 정보