Nginxで「Apache Alias」のような場所を設定しようとしましたが、このフォルダでPHPスクリプトを処理できません。
これが私のフォルダ構造です(Dev環境用):
/var/www
+- dev/public/ <-- This is my normal Web root : "/"
| +- assets/
| | +- app.css
| | +- app.js
| |
| +- index.php
| +- favicon.png
|
+- cut/public/ <-- This must like an "Apache Alias" : "/cut"
+- assets/
| +- app.css
| +- app.js
|
+- index.php
+- other_other_file.php (why not)
さまざまな解決策を試しましたが、どれも機能していません。
これが私の最高のNginx設定です:
server {
listen 80;
server_name _;
root /var/www/dev/public/;
index index.php index.html;
autoindex on;
# Logs
rewrite_log on;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
# Serving files
location / {
try_files $uri $uri/ @php;
}
location /cut {
root /var/www/cut/public;
try_files $uri $uri/ @php;
}
# PHP
location @php {
rewrite ^(.*)/?$ /index.php$is_args$args last;
}
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
これを使うと、私のcut/public/
フォルダのすべてのコンテンツがdev/public/index.php
にリダイレクトされ、解釈されます(try_file
が原因であると思います)。
それがあなたの助けが歓迎される理由です。
最終的な解決策
@ richard-smithの回答の後、実装されたソリューションは次のとおりです。
server {
listen 80;
server_name _;
root /var/www/dev/public/;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location ^~ /cut {
rewrite ^/cut/?(.*)$ /cut/public/$1 last;
}
location ^~ /cut/public {
root /var/www/;
try_files $uri $uri/ /cut/index.php$is_args$args;
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
2つのPHPアプリケーションを並べて実行する場合、共通のドキュメントルートが必要か、正しいlocation ~* \.php
を保証するために2つのSCRIPT_FILENAME
(または類似の)ブロックが必要ですfastcgiバックエンドに送信されます。
ネストされたlocation
ブロックを使用して/cut
サブディレクトリを分離し、トップレベルで^~
修飾子を使用して、他のトップレベルの正規表現location
ブロックが干渉しないようにします( このドキュメント )。
alias
ディレクティブ( このドキュメント を参照)は、/cut
を/var/www/cut/public
にマップするために使用されます。 root
ディレクティブは連結のみ可能であり、これにより/var/www/cut/public/cut
が作成されます(これは不要です)。
ただし、 この長期的な問題 のため、alias
ディレクティブをtry_files
ディレクティブとともに使用することはお勧めしません。
したがって、解決策は、/cut
を/cut/public
にサイレントに書き換え、root /var/www
の値を使用することです。
例えば:
location ^~ /cut {
rewrite ^/cut(.*)$ /cut/public$1 last;
}
location ^~ /cut/public {
root /var/www;
try_files $uri $uri/ /cut/index.php$is_args$args;
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}