PERL Dancer2, диспетчер cgi и помощник uri_for

У меня есть веб-интерфейс, который мне нужно поддерживать и улучшать, написанный в старом простом стиле CGI.pm. Это приложение также не использует систему шаблонов. Он обслуживается apache, например:

/var/www/vhost/myapp/cgi-bin/app.cgi
              /htdocs/css/styles.css
              /htdocs/js/script.js

Чтобы добавить новые страницы в это приложение и упростить себе жизнь, я хочу разместить приложение Dancer или Dancer2 рядом с ним, я думал о чем-то вроде этого:

/var/www/vhost/myapp/cgi-bin/app.cgi
                    /cgi-bin/dispatch.cgi (the one from Dancer2)
                    /htdocs/css/styles.css
                           /js/script.js
                           /dancer_public/...
                    /dancer2/lib/...
                            /views/...
                            /environement/...

В диспетчере меняю путь для доступа к Dancer2 bin/app.psgi. Я добавил следующий файл .htaccess в каталог htdocs:

# BEGIN dancer application htaccess
  RewriteEngine On
  RewriteBase /v2
  RewriteRule ^/v2$ /cgi-bin/dispatch.cgi [L]
  RewriteCond %{SCRIPT_FILENAME} !-d
  RewriteCond %{SCRIPT_FILENAME} !-f
  RewriteRule v2/(.*) /cgi-bin/dispatch.cgi/$1 [L]
# END dancer application htaccess

Делая это,

  • доступ к example.com/cgi-bin/app.cgi показывает мне старое приложение, как и ожидалось
  • доступ к example.com/v2 показывает мне домашнюю страницу приложения dancer, по умолчанию, без css, что ожидается, поскольку я переместил общедоступный каталог, и некоторые другие изменения

Теперь, когда у вас есть настройка, вот где у меня есть проблема: перенаправление с v2 на приложение dancer работает очень хорошо, однако, чтобы сохранить согласованность, я хотел бы иметь uri_for создание URL-адреса из v2, но он использует SCRIPT_NAME в качестве базового URL-адреса, чтобы показать проблему, когда я создаю этот URL-адрес: uri_for('/mypage'),

  • я хотел бы иметь этот URL: example.com/v2/mypage,

  • но вместо этого у меня есть URL-адрес example.com/cgi-bin/dispatch.cgi/mypage

Переменная среды SCRIPT_NAME содержит cgi-bin/dispatch.cgi , у меня есть один ужасный хак, который работает, но явно не является решением, я могу получить ожидаемое поведение, заставив SCRIPT_NAME в /v2 в диспетчере cgi, в блоке BEGIN . Если бы кто-то как чистое решение для этого, это было бы большим подспорьем!

Спасибо


person Pierre VIGIER    schedule 19.04.2015    source источник


Ответы (1)


Такая же проблема с D1.

$ENV{SCRIPT_NAME} = '';

внутри dispatch.fcgi мне помогает.

person Nick Knutov    schedule 19.04.2015