nginxは書き換えルールに一致しない場合は静的ファイルを直接提供します

nginxは書き換えルールに一致しない場合は静的ファイルを直接提供します

Apache から nginx に移行したばかりですが、うまく機能しない構成設定に苦労しています。以前の .htaccess ファイルから次のルールを取得して、nginx ルールに変換しようとしています。

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 ファイルに送信します。

静的ファイルを直接提供する方法と、最初のルールを作成する方法はわかっています。解決方法がわからないのは、これら 2 つの条件を連携させることです。これまでのところ、次のようになっています。

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
}

前述したように、これら 3 つの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
}

関連情報