주소창에서 PHP 확장자와 index.php를 생략할 수 있도록 Nginx 설정하기

PHP 확장자 생략

Nginx는 기본 설정으로 PHP 확장자가 있는 파일을 FastCGI로 처리를 해서 결과를 HTML 페이지로 출력합니다.

UI에 "php" 확장자가 없으면 Nginx는 확장자가 없는 "index." 파일을 찾게 되고 파일이 없는 것으로 인식합니다.

Nginx의 설정 파일을 수정해서 확장자가 없는 파일은 PHP가 처리하도록 설정을 변경할 수 있습니다.

PHP를 서비스하는 웹 사이트용 설정 파일을 연 후 "location / {" 위치를 찾아서 다음 내용으로 수정합니다. 라우팅을 할 때 정확한 파일명(확장자 포함)이 없으면 "=404", 즉 "404 Not Found" 페이지를 표시합니다. 404페이지 대신 제어를 다른 라우트 처리로 넘기도록 @rewrite 지시자로 경로를 표시합니다.

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ @rewrite;
        }

@rewrite 라우트 처리를 추가합니다. 404 Not Found로 넘어온 URI에 rewrite 모듈로 ".php" 확장자를 붙여서 php-fpm이 처리할 수 있도록 합니다.


        location @rewrite {
                rewrite ^ $uri.php last;
        }

이제 "http://도메인/blog" 와 같은 경로는 내부 처리를 할 때 "http://도메인/blog.php"로 처리가 됩니다.

index.php 생략

하위 경로를 접근할 때 기본 접근 파일을 생략함으로써 URI를 간결하게 표현할 수 있습니다. 워드프레스나 많은 PHP 기반 CMS들이 하위 경로의 기본 연결 파일을 "index.php"로 사용합니다. Nginx 설정에 기본 파일로 "index.php"가 추가 설정되어 있지 않으면 "403 Forbidden" 에러가 발생합니다.

PHP를 서비스하는 웹사이트용 설정 파일을 연 후 "index" 파일 목록에 "index.php"를 추가해줍니다. 파일명 없이 하위 URL 경로만 표시되면 index.php 파일을 찾아서 파일이 있으면 index.php 파일을 표시합니다.

        index index.php index.html index.htm index.nginx-debian.html;

이제 "http://도메인/blog/"와 같은 경로는 "http://도메인/blog/index.php"로 내부 처리가 됩니다.

설정 파일 저장 후 Nginx를 다시 시작합니다.

sudo systemctl restart nginx

예를 들어 Nginx로 PHP 웹사이트를 호스팅할 때는 다음과 같이 기본 Nginx 설정 파일을 구성해서 확장자가 없는 페이지 접근을 할 때 "php" 확장자를 붙이고, 하위 디렉토리 경로만으로 접근할 때 기본 페이지로 "index.php"를 사용하게 됩니다. 80포트 연결만 구성한 것입니다.

server {
    listen 80;

    server_name mydomain.com;

    root /var/www/mydomain.com;

    index index.php index.html;

    access_log /var/log/nginx/mydomain.com.access.log;
    error_log /var/log/nginx/mydomain.com.error.log;

    location / {
        try_files $uri $uri/ @rewrite;
    }

    location @rewrite {
        rewrite ^ $uri.php last;
    }

    location ~ \.php$ {
           include snippets/fastcgi-php.conf;
    #
    #       # With php-fpm (or other unix sockets):
           fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    #       # With php-cgi (or other tcp sockets):
    #       fastcgi_pass 127.0.0.1:9000;
    }
}