В числе продуктов австралийской компании Atlassian есть Jira Service Desk для организации работы службы поддержки и Confluence для совместной работы над wiki-подобной базой знаний. Особенностью этих продуктов является совместная интеграция между собой, в частности клиентам Jira Service Desk можно читать статьи в Confluence без назначения соответствующей лицензии. Но это работает ровно до тех пор, пока оператор поддержки не пришлёт клиенту короткую ссылку на Confluence в формате https://confluence.example.com/x/UgCZAQ
.
И вот тут нас ждёт сюрприз, так как эта ссылка у клиента не откроется. При этом если разрешить к Confluence анонимный доступ, то для гостей такая ссылка работать будет, но для клиентов Jira Service Desk — нет, разработчики Atlassian тут непреклонны. Ошибка известна разработчикам, но исправлять её не торопятся и обходного решения нет: CONFSERVER-55964.
Можно было бы смириться с данной особенностью, но есть проблема — ссылки в формате TinyURL принудительно генерируются при использовании штатной функции «Поделиться этой страницей». А раз так, то придётся самим искать обходной путь. К счастью, формат таких ссылок не является секретом и даже есть статья о том, как их генерировать самостоятельно: How to programmatically generate the tiny link of a Confluence page. Как видно алгоритм там не сложной и обратимый, а значит написать обратную реализацию не составит труда.
Примечание 1. В данной статье подразумевается, что в качестве frontend-сервера для Confluence используется nginx.
Примечание 2. Для расшифровки нам потребуется модуль ngx_http_perl_module, соответственно он должен присутствовать в вашей системе.
Для обратного преобразования короткой ссылки в формате TinyURL в обычную ссылку в формате PageID создадим небольшой модуль tinyurl.pm
, в котором выполним обратные преобразования и перенаправим пользователя на соответствующую страницу в Confluence:
package tinyurl; use nginx; use MIME::Base64; use constant URL => '/pages/viewpage.action?pageId='; sub decode { my $r = shift; my $id = $r->filename; # Transform tiny string to base64 string $id =~ s/(.*)\///ge; $id .= "A" x (8 - length($id)); $id =~ tr/-/\//; $id =~ tr/_/+/; # Convert base64 string to page ID $id = decode_base64($id); $id = unpack('L', $id); # Redirect to page $r->status(302); $r->header_out('content-length', 0); $r->header_out('location', URL . $id); $r->send_http_header('text/html'); return OK; } 1; __END__
Внесём изменения в конфигурацию nginx:
load_module "ngx_http_perl_module.so"; … http { perl_require tinyurl.pm; … server { server_name confluence.example.com; … location /x/ { perl tinyurl::decode; } } }
После выполнения nginx -s reload
за обработку коротких ссылок вместо Confluence будет отвечать nginx и при запросе https://confluence.example.com/x/UgCZAQ
любой пользователь будет перенаправлен на https://confluence.example.com/pages/viewpage.action?pageId=26804306
.