2016-08-24 11 views
1

私は、nginx 1.10とCentos7で動作するフロントコントローラ付きのsymfony2のようなアプリでかなり標準的な設定をしています。この予想予想、ブロックなどのようにすべての作品nginx add_header on front controller with PHP特定のURIに

server { 
    listen 80; 

    root /opt/my/code/web; 
    index app.php; 
    charset utf-8; 

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

    # pass the PHP scripts to php5-fpm 
    location ~ ^/app\.php(/|$) { 

     # problem here 
     location ~ ^/recording { 
      add_header Content-Type audio/x-wav; 
     } 

     fastcgi_split_path_info ^(.+?\.php)(/?.*)$; 
     fastcgi_pass unix:/var/run/php-fpm.sock; 
     fastcgi_index app.php; 
     include /etc/nginx/fastcgi_params; 
     fastcgi_param DOCUMENT_ROOT $realpath_root; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

     # Prevents URIs that include the front controller. This will 404: 
     internal; 
    } 

    # return 404 for all other php files not matching the front controller 
    location ~ \.php$ { 
     return 404; 
    } 
} 

私はいくつかの問題を持っていますが、主なものは、私はURIのための特別な処理が/recordingにマッチしたいということですが、それはまだフロントコントローラを通過しなければなりません。 try_files/app.phpに更新される位置合わせのために使用location ~ ^/app\.php(/|$) nginxのの$uriパラメータにリダイレクトするため

(これは議論の余地がないが、それはフロントコントローラを通過し、URIが/recordingと一致する場合、応答ヘッダを修正しなければならない)ので、任意のネストされた場所動作しません。

add_headerディレクティブが内部リダイレクトでドロップされるため、フロントコントローラーブロックの外側ではadd_headerを使用できません。

明らかに私はlocation ifadd_headerのどちらも使用できません。

これはApacheで簡単ですが、私が見つけた唯一のリモートソリューションはサードパーティ製のluaモジュールを使用しており、インストールドキュメントはそれほど薄くなく、centosのソースからコンパイルすると心臓の動悸。

+0

特に私は、あきらめたことはうまく動作しませんので、私はちょうどこのコードのhttpsをmordernized(サポートするのがより困難とキュートではない:)があるためところで、私はこのソリューションを示唆していません) ://gist.github.com/Erutan409/8e774dfb2b343fe78b14#file-mimetype-phpそして応答の前にファイル拡張子を使用してMIMEタイプを設定してください – WiR3D

答えて

1

内部リダイレクトは、私たちを気にした場合、内部リダイレクトを削除することができます:)のFastCGI設定の重複

server { 
    listen 80; 

    root /opt/my/code/web; 
    index app.php; 
    charset utf-8; 

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

    location ~ ^/recording { 
     add_header Content-Type audio/x-wav; 
     fastcgi_pass unix:/var/run/php-fpm.sock; 
     include /etc/nginx/fastcgi_params; 
     fastcgi_param SCRIPT_NAME /app.php; 
     fastcgi_param SCRIPT_FILENAME $document_root/app.php; 
    }  

    # pass the PHP scripts to php5-fpm 
    location ~ ^/app\.php(/|$) { 
     fastcgi_split_path_info ^(.+?\.php)(/?.*)$; 
     fastcgi_pass unix:/var/run/php-fpm.sock; 
     fastcgi_index app.php; 
     include /etc/nginx/fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

     # Prevents URIs that include the front controller. This will 404: 
     internal; 
    } 

    # return 404 for all other php files not matching the front controller 
    location ~ \.php$ { 
     return 404; 
    } 
} 

第二の溶液は、あなたが他のすべての要求のコンテンツタイプを知っている場合にのみ機能しますが、それは簡単に解決することができます。変数を使うことができます。私の場合は

server { 
    listen 80; 

    root /opt/my/code/web; 
    index app.php; 
    charset utf-8; 

    location/{ 
     try_files $uri $uri/ /app.php$is_args$args; 
     set $ct "text/html"; 
    } 

    location ~ ^/recording { 
     try_files $uri $uri/ /app.php$is_args$args; 
     set $ct "audio/x-wav"; 
    }  

    # pass the PHP scripts to php5-fpm 
    location ~ ^/app\.php(/|$) { 
     fastcgi_split_path_info ^(.+?\.php)(/?.*)$; 
     fastcgi_pass unix:/var/run/php-fpm.sock; 
     fastcgi_index app.php; 
     include /etc/nginx/fastcgi_params; 
     fastcgi_param DOCUMENT_ROOT $realpath_root; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

     add_header "Content-Type $ct; 

     # Prevents URIs that include the front controller. This will 404: 
     internal; 
    } 

    # return 404 for all other php files not matching the front controller 
    location ~ \.php$ { 
     return 404; 
    } 
} 
+0

最初の解決策は十分にエレガントです。私は重複が気に入らないようにします。私はまた、私はいくつかのポイントでより多くの特別な処理が必要な場合は、位置の一致とスタック位置ブロックと巧みになることができます – WiR3D

+1

それはほぼnginxの開発チームの公式な点です:*それを複製!重複が多すぎる場合 - 使用するか、外部テンプレートシステム*を使用します。おそらく、それは設定パーサーをよりシンプルに保つのに役立つでしょう。 投稿を編集しましたが、間違ったfastcgi_paramでした。 –

+0

もしそれが公式なら私はリンクすると言っています、それは知っていることは非常に重要なことです。 – WiR3D

関連する問題