Nginx $ document_root $ fastcgi_script_name 대 $ request_filename


16

구성 파일에서 설정하면 아무런 차이가 없습니다.

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

또는:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

그들은 각각 무엇을합니까? 둘 중 하나가 다른 것보다 낫습니까?

미리 감사드립니다.

답변:


24

설명서에 나와있는 내용은 다음과 같습니다.

$ request_filename

이 변수는 지시문 루트 또는 별명 및 URI 요청으로 구성된 현재 요청의 파일 경로와 같습니다.

$ document_root

이 변수는 현재 요청의 지시문 루트 값과 같습니다.

$ fastcgi_script_name

이 변수는 URI 요청과 같거나 URI가 슬래시로 끝나면 URI 요청에 fastcgi_index가 제공 한 색인 파일의 이름을 더한 것입니다. SCRIPT_FILENAME 및 PATH_TRANSLATED 대신이 변수를 사용할 수 있으며, 특히 PHP에서 스크립트 이름을 결정하는 데 사용됩니다.

여기에 작성된 것처럼 fastcgi_index 또는 fastcgi_split_path_info를 사용할 때 차이가 있습니다. 어쩌면 더있을 수도 있습니다 ... 지금 내가 아는 것입니다.

요청 /info/을 받고 다음 구성을 갖습니다.

fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;

SCRIPT_FILENAME동일 것이다 /home/www/scripts/php/info/index.php, 그러나 사용 $request_filename단지 것 /home/www/scripts/php/info/.

구성 fastcgi_split_path_info도 중요합니다. 추가 도움이 필요하면 여기를 참조하십시오 : http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info


이것은 사실이 아닌 것 같습니다 (더 이상은 아닙니다). Steely Wing의 답변을 참조하십시오.
Rimas Kudelis

@RimasKudelis 나는 이것을 오랫동안 사용하지 않았지만 문서는 변경되지 않았으므로 여전히 작동하기를 기대합니다 fastcgi_split_path_info. 어쩌면 당신 의 조정이 필요할 것입니다. Steely Wing의 답변은 문서가 아니라 경험에 기반한 것 같습니다.
SimonSimCity

그렇습니다. 그리고 나의 의견은 또한 경험에 근거합니다. fastcgi_split_path_info두 개의 캡처 외부에 내 별칭 접두사를 제외시켜 조정하려고 시도했지만 아무런 효과가없는 것 같습니다. 별명을 포함하는지 여부에 관계없이 $request_filenameas로 전달 SCRIPT_FILENAME하는 것이 매력처럼 작동합니다.
Rimas Kudelis

실제로, NginX 문서가 추가 된 추가없이 실제 파일 이름이 포함되어 SCRIPT_FILENAME있을 때 처음에 두 개의 문자열을 연결하도록 제안하는 이유를 이해할 수 없습니다 $request_filename. 실제로 위의 예제는 $request_filename파일이 명시 적으로 요청되지 않은 경우에도 경로와 달리 파일 이름을 포함 하므로 실제로 올바르지 않습니다. 적어도 어제 나의 결론이다.
Rimas Kudelis

7

TLDR

에 사용 $request_filename하는 것이 좋습니다 SCRIPT_FILENAME.


root지시문 을 사용하는 경우

$document_root$fastcgi_script_name와 같습니다 $request_filename.

alias지시문 을 사용하는 경우

$document_root$fastcgi_script_name$fastcgi_script_name경로가 아닌 URL의 경로 이므로 잘못된 경로를 반환합니다 $document_root.

구성이있는 경우

location /api/ {
    index  index.php index.html index.htm;
    alias /app/www/;
    location ~* "\.php$" {
        try_files      $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        # fastcgi_param  SCRIPT_FILENAME  $request_filename;
    }
}

요청 /api/testing.php:

  • $document_root$fastcgi_script_name == /app/www//api/testing.php
  • $request_filename == /app/www/testing.php

요청 /api/:

  • $document_root$fastcgi_script_name == /app/www//api/index.php
  • $request_filename == /app/www/index.php

그리고를 사용 $request_filename하면 index지시문을 사용하여 색인을 설정해야 fastcgi_index작동하지 않습니다.


2

그 줄은 'fastcgi_params'파일에서 가져온 것 같습니다.

기본적으로 SCRIPT_FILENAMEvhost 파일에서 루트 지시문을 정의 할 때 이미 정의 되어 있기 때문에 오류가 발생하지 않습니다 . 따라서 vhost 파일에서 명시 적으로 정의하지 않는 한의 fastcgi_param값을 사용 SCRIPT_FILENAME하여 루트 지시어에서 가져옵니다. 요청을 PHP 서버로 보내기 위해 nginx에 필요한 또 다른 변수가 $fastcgi_script_name있으며 반복 URL과 슬래시로 끝나는 URI의 오류를 피하기 위해 잘 정의해야합니다.

결론 :

모든 것이 SCRIPT_FILENAME훌륭하게 작동하도록하려면 모든 사람이 / etc / nginx 폴더에있는 'fastcgi_params'파일에 명시 적으로 정의 하거나 PHP 위치 블록에 다음 줄을 포함시켜 사이트 사용 가능 폴더에있는 사이트의 호스트에서 쉽게 정의해야합니다 .

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

위와 같이 'fastcgi_params'파일에 포함되어있는 것과 동일합니다. ngnix를 PHP-FPM에 연결하는 자세한 정보는 다음을 참조하십시오.

https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/

나는 그것이 미래의 누군가를 도울 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.