2016-08-24 8 views
1

У меня довольно стандартная настройка с симфоническим приложением с фронтальным контроллером, работающим на nginx 1.10 и Centos7. Это все работает, как и ожидалось, блоки там, где ожидается и т.д.nginx add_header на конкретном URI на PHP-приложение с передним контроллером

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, но он все еще должен пройти через фронт-контроллер. (Это не спорно, он должен пройти через фронт-контроллер и изменить заголовок ответа, если URI соответствует /recording)

С try_files перенаправляет к параметру location ~ ^/app\.php(/|$) Nginx в $uri используется для согласования местоположения обновляются до /app.php, поэтому любых вложенных мест не будет работать.

Я не могу использовать add_header вне блока контроллера, потому что любые директивы add_header будут сброшены при внутренней переадресации.

Очевидно, что я не могу использовать location if с add_header.

Это простое в apache, но единственное удаленное решение, которое я нашел, использует сторонний модуль lua, и документы по установке немного тонкие, и мысль о компиляции из источника на centos дает мне сердцебиение ,

+0

в моем случае конкретно я отказался, он просто не будет работать, так что я просто mordernized этот код HTTPS : //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 dev: * Дублируйте его! Если слишком много дублирования - использование включает или внешнюю систему шаблонов *. Вероятно, потому что это помогает упростить конфигурационный анализатор. Я отредактировал мое сообщение, было ошибкой fastcgi_param. –

+0

Если бы это было официальное, я бы сказал, ссылку на него, потому что это ОЧЕНЬ важная вещь, чтобы знать. – WiR3D