Конфигурирование Apache для правильной работы Mojolicious


Конфигурирование Apache для правильной работы Mojolicious

Здесь мы расскажем как удалось красиво исправить ошибку формирования ссылки вида <%= url_for ‘func_name’ %> в шаблоне Mojolicious при работе под Apache во FreeBSD

 

В чем состояла ошибка url_for ?

Ошибка состояла в неправильном формировании ссылок в шаблонах сайта, та где было указано  <%= url_for ‘func_name’ %> и ожидалась ссылка «/cart» показа сайта в браузере ссылка была   «/cgi-bin/cms/cart»  

При этом, и это важно, если запустить сайт на Mojolicious не используя Apache, запуском через hypnotoad  или morbo, то именно эта же ссылка <%= url_for ‘func_name’ %>   формировалась правильно, как «/cart» , как и было запрограммировано.

Странности такой работы Mojo на этом не закончились. Оказалось, что при обращении по URL  «/cgi-bin/cms/cart»  работает, при обращении (если набрать вручную в браузере) к «/cart»  тоже работает и в обоих случаях выдает одну и ту же страницу.

Вот это оказалось действительно  неожиданно, ведь в роутах Моджолишоса не было роута «/cgi-bin/cms/cart», был только   «/cart» 

$r->get('/cart')->to('Cart#show')->name('cart');

 

Варианты решения ошибки со ссылкой в Mojolicious

Поиск в интернете дал несколько путей исправления ошибки url_for

  • Написать свою функцию аналогичную «url_for»
  • Написать обработчик, который после отработки «url_for» убирал бы «/cgi-bin/sdep.ru»  перед отдачей страницы пользователю.
  • Прописывать в шаблоне ссылки явно, то есть не <a href=”<%= url_for ‘func_name’ %>” > а явно указывать ссылку <a href=”/cart” >
  • Другие варианты непонятны.

 

Мы пошли другим путем – наверное самым правильным.

Разобрались и  исправили конфигурацию Apache, ведь формирование ссылки вида /cgi-bin/cms/cart происходит только при работе Mojolicious под Apache.  

 

Пример правильной конфигурации Apache для работы Mojolicious

<VirtualHost 127.0.0.1:81>

        ServerName sdep.ru

        DocumentRoot   /usr/local/www/sdep.ru/public

        DirectoryIndex index.html

        <Directory /usr/local/www/sdep.ru/public >

                Options All

                AllowOverride All

                Require all granted

                SSILegacyExprParser on

        </Directory>

        # корректируется только эта строка

        ScriptAlias /    /usr/local/www/sdep.ru/script/cms/

        <Directory  /usr/local/www/sdep.ru/script >

                Options ExecCGI

                Require all granted

        </Directory>

</VirtualHost>

 

Обратите внимание!  В строке указан полный путь к исполняемому файлу «cms» который расположен по пути «/usr/local/www/sdep.ru/script/cms»  и в конце поставлена «/» при этом путь ScriptAlias сокращен до «/»   

 

После этого перезапускаем Апач командой apachectl  graceful  и заходим в браузере на сайт - и все работает. Ссылки внутри шаблонов страниц теперь формируются правильно.

 

Но  кроме того, оказалось что при такой конфигурации в папке «/public» теперь не нужен файл .htaccess   что на самом деле даже лучше для работы с сайтом.

 

Заключение

Вот такой вариант конфигурирования связки  Mojolicious +  Apache + Nginx является правильным.

Здесь удалось красиво решить проблемы с запуском сайтов  Mojolicious под Apache и добиться корректной и идентичной работы сайта Mojolicious - Apache - Nginx  полностью аналогичной работе сайта просто под Mojolicious.

Вот именно такой способ конфигурирования используем и рекомендуем использовать для Mojolicious.

 

Почитать

Конфигурирование Apache для запуска  в продакшн Mojolicious

Mojolicious  framework – запуск в продакшн на Apache

Конфигурирование Apache для правильной работы Mojolicious

Решение проблемы с «засыпанием» сайтов на  Mojolicious