nginx는 재작성 규칙과 일치하지 않는 경우 정적 파일을 직접 제공합니다.

nginx는 재작성 규칙과 일치하지 않는 경우 정적 파일을 직접 제공합니다.

방금 Apache에서 nginx로 옮겼는데 작동하지 않는 것 같은 일부 구성 설정으로 인해 어려움을 겪고 있습니다. nginx 규칙으로 변환하려는 이전 .htaccess 파일의 규칙이 있습니다.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(js|css)/([a-z0-9\.]+)\.(js|css)$ $1/index.php?hash=$2 [L,QSA]

RewriteCond %{REQUEST_URI} !\.(gif|jpe?g|s?html|css|js|cgi)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

알 수 있듯이 이는 존재하지 않지만 지정된 패턴을 따르는 각 파일이 PHP 스크립트에 의해 제공되어야 함을 의미합니다. 더 이상의 처리는 없습니다. 그런 다음 정적이지 않고 디스크에 존재하지 않는 각 파일에 대해 기본 index.php 파일로 보냅니다.

나는 정적 파일을 직접 제공하는 방법을 알고 있으며 첫 번째 규칙을 만드는 방법을 알고 있습니다. 내가 해결하는 방법을 모르는 것은 이 두 조건이 함께 작동하도록 하는 것입니다. 지금까지 내가 가진 것은 다음과 같습니다.

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

location /js/ { 
    rewrite ^/js/([a-z0-9.]+).js$ /js/index.php?hash=$1 break; 
} 

location /css/ { 
    rewrite ^/css/([a-z0-9.]+).css$ /css/index.php?hash=$1 break; 
}

# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
    access_log        off;
    expires           30d;
    add_header Pragma public;  
    add_header Cache-Control "public"; 
} 

location ~ \.php$ {
    # basic settings for php files
}

앞서 말했듯이 세 가지 location지시어를 모두 활성화하면 정적 파일이 직접 제공되지만 지정된 패턴을 따르는 스타일 또는 js 파일은 404 오류를 반환합니다(특정 위치에서 찾을 수 없기 때문에). 정적 파일 지시어에 주석을 달고 스크립트에서 제공해야 하는 css/js에 대한 다시 쓰기 규칙을 활성화하면 css/js 디렉터리 내의 정적 파일은 제공되지 않지만(빈 페이지가 반환됨) 다른 모든 정적 파일은 제공됩니다. 정상적으로 서비스됩니다.

더 이상 무엇을 해야할지 모르겠습니다. 나는 이 문제를 해결하는 방법을 인터넷에서 찾는 데 몇 시간을 보냈지만 시도한 모든 것이 작동하지 않았습니다.

답변1

해결책:

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

# serve static files directly
location ~* \.(?:jpg|jpeg|gif|css|png|js|ico)$ {
    access_log        off;
    expires           30d;
    add_header Pragma public;
    add_header Cache-Control "public";
    try_files $uri @fallback;
}

location @fallback {
    rewrite ^/(js|css)/([a-z0-9.]+)\.(js|css)$ /$1/index.php?hash=$2;
}

location ~ \.php$ {
    # basic settings for php files
}

관련 정보