Здесь мы расскажем как удалось красиво исправить ошибку формирования ссылки вида <%= 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