Nginx-모든 요청을 단일 스크립트로 라우팅


11

스크립트 라우팅을 처리하고 모든 종류의 멋진 작업을 수행하는 PHP 스크립트가 있습니다. 원래 Apache 용으로 설계되었지만 일부 상자에 대해 nginx로 마이그레이션하려고합니다. 지금은 테스트 서버에서 문제를 해결하려고합니다.

따라서 스크립트가 작동하는 방식은 .htaccess파일을 사용하여 디렉토리 (Apache에서)에 대한 모든 HTTP 트래픽을 가로채는 것 입니다. 그 모습은 다음과 같습니다.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>

꽤 직설적 인. 모든 요청은 index.php단순하고 단순합니다.

나는 nginx에서 그 행동을 모방하려고하지만 아직 방법을 찾지 못했습니다. 누구든지 제안이 있습니까?

nginx.conf현재 내 파일 의 사본이 있습니다. 그것이 작동하도록 노력하기 위해 고안되었습니다. 주로 복사 / 붙여 넣기 작업.

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
        include         /etc/nginx/mime.types;
        default_type    text/plain;
        include         /etc/nginx/conf.d/*.conf;
        server {
                listen          80;
                server_name     swingset.serverboy.net;

                access_log      /var/log/nginx/net.serverboy.swingset.access_log;
                error_log       /var/log/nginx/net.serverboy.swingset.error_log warn;

                root            /var/www/swingset;

                index           index.php index.html;
                fastcgi_index   index.php;

                location ~ \.php {
                        include /etc/nginx/fastcgi_params;
                        keepalive_timeout 0;
                        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        fastcgi_pass    127.0.0.1:9000;
                }
        }
}

답변:


13

이거 추가 해봐,

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

그것이하는 것은 먼저 실제 파일 / 폴더로 $ uri 및 $ uri /의 존재를 확인하고 존재하지 않는 경우 /index.php를 통과합니다 (즉, 색인을 통해 라우팅이 수행되는 Zend 프레임 워크의 설정입니다) .php)-물론 일부 매개 변수를 전달 해야하는 경우 /index.php에 끝에? q =를 추가하면 매개 변수가 전달됩니다.

try_file 지시문은 버전 0.7.27 이상에서 사용 가능해야합니다.


경고 :로 끝나는 URL에서는 작동하지 않습니다. .php 예를 들어 다음과 같이 작동 /doesNotExist.ph 하지만 작동하지 않습니다 (대신 404가 됨) :/doesNotExist.php
hanshenrik

7

나는 그것을 스스로 알아 냈습니다! 네!

location블록에 필요한 것은 다음과 같습니다.

location /  {
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_pass    127.0.0.1:9000;
}

다른 모든 것은 거의 동일하게 유지되었습니다.


내가 쓴 것을 시도 했습니까? 또한 모든 정적 파일이 index.php를 통과한다는 것을 의미합니다.
Adam Benayoun

@ 아담 : 예, 코드를 시도했습니다. 모든 것이 index.php를 통해 실행되기를 원했습니다. 그래도 고마워!
mattbasta

2

GET 인수를 유지하려면 다음을 사용하십시오.

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

$ is_args는 '?'가됩니다 $ args가 비어 있지 않은 경우

또는 더 간단한 :

location / {
    try_files /index.php$is_args$args;
}

경고 :로 끝나는 URL에서는 작동하지 않습니다. .php 예를 들어 다음과 같이 작동 /doesNotExist.ph 하지만 작동하지 않습니다 (대신 404가됩니다) :/doesNotExist.php
hanshenrik

1

루트 디렉토리를 설정 한 후 이것을 추가하십시오

if (!-e $request_filename)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

필요에 따라 query_string을 index.php로 판결해야하므로 정규 표현식을 변경할 수 있습니다


4
if그가 요구하는 것을 성취하는 것보다 더 좋은 방법이 있습니다. wiki.nginx.org/IfIsEvil
Isius

0

한 가지 매우 중요한 함정이 대상이 PHP 파일 때의주의 할 무엇이든 있는지 확인하는 것입니다 return/ rewrite당신이 사용하는 대체할만한하지 않는 규칙 location ~ \.php지시어. 이 경우 nginx는 PHP 파일을 렌더링하지 않고 PHP 파일을 제공하여 PHP 소스 코드를 공개합니다. 이것은 치명적일 수 있습니다.

가장 안전한 방법이 이미 제공되어 있습니다. location / { try_files $uri $uri/ /index.php; }

확인 당신은 또한 설정 index index.php당신의 location /블록 및 주석 location ~ \.php기본 설정 파일에 포함 된 블록을.

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