Nginx 정규식 vhost 패턴은 PHP 서버 이름으로 끝납니다.


12

다음과 같이 정규 표현식이 일치하는 nginx 서버 정의가 있습니다.

server_name ~^(?<vhost>[a-z0-9-]+)\.example\.com$;
root /var/www/example/$vhost;
access_log /var/log/nginx/$vhost.example-access.log;

그러나이 도메인은 fastcgi 및 PHP-FPM을 사용하여 다양한 PHP 프로젝트를 호스팅하며 $_SERVER다음 과 같은 값을받습니다 .

SERVER_NAME => "~^(?<vhost>[a-z0-9-]+)\.example\.com$"
HTTP_HOST   => "myhost.example.com"

보시다시피 정규 표현식 패턴은 SERVER_NAME일치하는 문자열이 아니라 삽입됩니다 . 그것은 나에게 약간 버그가있는 것처럼 보이고 불필요한 세부 정보를 드러내는 보안 위험을 나타냅니다 (다른 구성에서는 와일드 카드가 아닌 특정 이름 집합과 일치합니다).

"SERVER_NAME 대신 HTTP_HOST 사용"이라고 말할 수도 있습니다. 그렇게 단순하다면 SERVER_NAME에 서버 이름이 포함될 것으로 예상되는 라이브러리가 있습니다. 나는이 행동에 대한 좋은 사용 사례를 실제로 볼 수 없습니다.

답변:


14

이 질문을 작성하는 고무 덕 효과 덕분에 해결책을 찾았습니다.

Nginx의 스톡 fastcgi_params파일은 다음 줄을 포함합니다 :

fastcgi_param  SERVER_NAME        $server_name;

$_SERVER['SERVER_NAME']PHP 환경 에서 해당 값이 나타나는 원인입니다 .

$ host 변수 를 사용하도록 변경했습니다 .

fastcgi_param  SERVER_NAME        $host;

그리고 내 문제는 사라졌다. 이 접근법의 단점이 있는지 알고 싶습니다.


이 접근법의 유일한 단점은 $ host 변수에 의존하기 때문에 HTTP_HOST 헤더를 보내면 사용자가 덮어 쓸 수 있다는 것입니다. 이 사용하여 컬을 테스트 할 수 있습니다 curl --header "HOST: google.com" http://yourdomain/yourpage.php및 yourpage.php 넣어에서 : <?php echo $_SERVER['SERVER_NAME']; ?>당신은 google.com 볼
굴람 알리

2
server_name  ~^(?<subdomain>.+)\.example\.com$;
set $server_name_full $subdomain.example.com;


location ~ \.php$ {
    ...
    include fastcgi_params;
    fastcgi_param SERVER_NAME $server_name_full;
    ...
}

3
코드는 이해되지만 항상 함께 설명해야합니다. 오래 걸리지는 않지만 예상됩니다.
peterh-복원 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.