понедельник, 13 ноября 2017 г.

Oracle Apex: Использование mod_rewrite для перезаписи login-страниц под https

Я уже говорил, что не одобряю всеобщей мании тащить сайты целиком под https, когда в этом нет ни малейшей необходимости. Аргументы в пользу этого решения представляются мне надуманными и высосанными из пальца.

В данной статье я хочу вытащить одно довольно старое решение, когда я работал с Oracle Apex, и мне было необходимо затащить под https определенные страницы приложений, прежде всего - login.

В свое время это было довольно-таки непростой задачей. Да, достаточно просто написать регулярное выражение для перезаписи посредством mod_rewrite (мы не рассматриваем случаи, когда Apex использует DBMS_EPG, а говорим о ситуациях, когда обслуживаем приложение посредством Apache) статического URL в статический. Также нетрудно написать правило "статический URL -> динамический URL".

В случае с Apex, однако, проблема осложнялась тем, что мне было необходимо сохранить структуру динамических URL с идентификаторами сессий под https.

Таким образом, правило перезаписи становилось "динамический URL -> динамический URL", и на тот момент это вызвало определенные проблемы. Не так просто оказалось это сделать, пришлось даже прибегнуть к помощи гуру регулярных выражений.

Как бы то ни было, конечное решение оказалось неожиданно простым (ага, после того, как его объяснили и ткнули пальцем). Привожу его здесь - может пригодиться кому-нибудь.

 <IfModule mod_rewrite.c>  
   RewriteEngine on  
   # Resirect ApEx secure pages to HTTPS  
   RewriteCond %{SERVER_PORT} !^443$  
   RewriteCond %{QUERY_STRING} ^p=4[0-9][0-9][0-9]:|p=750:101:|p=750:LOGIN|p=750:104:|p=750:105:|p=ADV_SITE:104:|p=ADV_SITE:105:|p=700:150:|p=700:LOGIN|p=720:|p=ADV_ADMIN:LOGIN|p=ADV_EBA_KT01151:101:|p=ADV_EBA_KT01151:LOGIN|p=751:101:|p=751:LOGIN|p=ADV_EBA_KT01151:HOME|p=777:  
   RewriteRule ^/?pls/f$ https://%{SERVER_NAME}/pls/f [L]  
 </IfModule>  

(предполагается, что https в ssl.conf уже настроен)

Как видите, все сравнительно просто. В %{QUERY_STRING} перечисляются страницы (в формате "App ID:Page ID/Alias", которые требуется принудительно переписать под https. Затем идет RewriteRule, которое перенаправляет вышеперечисленные страницы под https.

Данный блок можно вставить как в httpd.conf, так и непосредственно в ssl.conf.

В случае (правильном), когда перед Apache находится реверсивный кэш-прокси (например, Oracle WebCache), условие RewriteCond %{SERVER_PORT} !^443$

будет использовать другой порт, обычно 4443.