Hi, Guest!
+

Nginx + CodeIgniter + Wordpress

17-09-2010 codeigniter nginx php Roumen

Nginx

Сблъсках се с интересен частен случай, сайта domain.tld се премества на сървър с nginx и php-fpm, сайта е правен на CodeIgniter и всички заявки към несъществуващи файлове трябва да водят до domain.tld/index.php, от където вече CI си прави логиката с MVC моделите и пермалинковете.

В директорията domain.tld/blog/ обаче има инсталиран Wordpress блог, който ползва pretty permalinks и не е интегриран по никакъв начин с CI, съответно си ползва собствена логика контролирана от domain.tld/blog/index.php, към където и съответно пък трябва да отиват заявките към него.

Проблема обаче е, че Nginx не ползва .htaccess файлове и правилата трябва да са в общия конфигурационен файл на сайта. Логичното решение беше да пробвам да разделя правилата с location /blog { } блок, обаче така не стигнах до успешно решение, понеже когато двете системи се помириха частично, Nginx полудя и започна да вади сървърни грешки на определени заявки, които се отнасят до файлове в под директориите на /blog например wp-admin и wp-content и съответно техните под директории.

Всичко щеше да е песен ако блога беше в отделен под домейн със съответно отделен виртуален хост, например blog.domain.tld, обаче случая не беше такъв, така че за да запазя структурата на сайта стигнах то следното решение:

За да разгранича заявките между CI и Wordpress включих една проста проверка на съдържанието на $uri преди да подам всичко към CI, като ако съдържаше стринг 'blog' заявката се пренасочва към Wordpress и проверките спират. Същият метод го изпробвах успешно и със сайт правен с Kohana, а по принцип би трябвало да работи и при други подобни фреймуорци.

location / {
    root     /www/domain.tld;
    index   index.php index.html;


    if (-f $request_filename) {
        break;
    }

    if (-d $request_filename) {
        break;
    }

   if ($uri ~* 'blog' ) {
       rewrite . /blog/index.php last;
       break;
   }

   if (!-e $request_filename) {
       rewrite . /index.php last;
   }

}