Я пытаюсь настроить nginx для обслуживания двух разных php-скриптов из двух разных мест. Конфигурация выглядит следующим образом.
/home/hamed/laravel
в которой должен обслуживаться ее /home/hamed/laravel
каталог. /home/hamed/www/blog
. И это моя конфигурация nginx
:
server { listen 443 ssl; server_name example.com www.example.com; #root /home/hamed/laravel/public; index index.html index.htm index.php; ssl_certificate /root/hamed/ssl.crt; ssl_certificate_key /root/hamed/ssl.key; location /blog { root /home/hamed/www/blog; try_files $uri $uri/ /blog/index.php?do=$request_uri; } location / { root /home/hamed/laravel/public; try_files $uri $uri/ /index.php?$request_uri; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/var/run/php5-fpm.hamed.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
Проблема в том, что при попытке доступа к разделу wordpress, вызывая example.com/blog
все же установка laravel берет на себя этот запрос.
Теперь я попытался заменить root
директиву внутри блоков location
alias
безрезультатно.
Согласно этому руководству, имеющему директиву index
или try_files
внутри location
запускается внутренняя перенаправка, которая, как я подозреваю, вызывает это поведение.
Кто-нибудь, пожалуйста, помогите мне понять это?
Проблема в том, что location ~ \.php$ { ... }
отвечает за обработку всех ваших php-скриптов, которые разделены на два разных корня.
Один из подходов состоит в том, чтобы использовать общий root
для контейнера server
и выполнять внутренние перезаписи в каждом блоке местоположения префикса. Что-то вроде:
location /blog { rewrite ^(.*\.php)$ /www$1 last; ... } location / { rewrite ^(.*\.php)$ /laravel/public$1 last; ... } location ~ \.php$ { internal; root /home/hamed; ... }
Вышеупомянутое должно работать (но я не тестировал его со своим сценарием).
Второй подход – использовать вложенные блоки местоположения. Блок location ~ \.php$ { ... }
затем реплицируется в блок местоположения каждого приложения. Что-то вроде:
location /blog { root /home/hamed/www; ... location ~ \.php$ { ... } } location / { root /home/hamed/laravel/public; ... location ~ \.php$ { ... } }
Теперь, когда он был протестирован для работы.
Благодаря @RichardSmith мне удалось создать правильную конфигурацию. Вот окончательная рабочая конфигурация. Мне пришлось использовать комбинацию вложенных блоков location
и обратное регулярное выражение для его работы.
server { listen 443 ssl; server_name example.com; root /home/hamed/laravel/public; # index index.html index.htm index.php; ssl_certificate /root/hamed/ssl.crt; ssl_certificate_key /root/hamed/ssl.key; location ~ ^/blog(.*)$ { index index.php; root /home/hamed/www/; try_files $uri $uri/ /blog/index.php?do=$request_uri; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/var/run/php5-fpm.hamed.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } location ~ ^((?!\/blog).)*$ { #this regex is to match anything but `/blog` index index.php; root /home/hamed/laravel/public; try_files $uri $uri/ /index.php?$request_uri; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/var/run/php5-fpm.hamed.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }