Страницы

Показаны сообщения с ярлыком apache. Показать все сообщения
Показаны сообщения с ярлыком apache. Показать все сообщения

четверг, 13 сентября 2012 г.

mod_rewrite + mod_proxy Apache 2.2 и обработка параметра в адресной строке

Задача

Обработать нужные параметр в адресной строке. Конкретно - выдать forbidden при использовании определённого параметра:
http://example.com/?foo=bar - forbdden

Проблема

Во-первых, оказалось, что команда mod_proxy PxoxyPassMatch не обрабатывает параметры в строке, т.е. такое не прокатит:
ProxyPassMatch foo=bar !
Во-вторых, использование правила mod_rewrite тоже не сработало:
RewriteEngine On
RewriteCond %{QUERY_STRING} foo=bar
RewriteRule ^.*$  - [F,P]
Точнее, оно работает, если нет других правил в mod_proxy, но они были, и вначале обрабатывались они. Казалось бы параметр [P] должен был заставить воспринимать rewrite как proxy, и просто записать это правило выше, но ничего подобного.

Решение

Rewrite правило, записанное выше, надо было просто поместить в <Location /></Location> и mod_rewrite стал срабатывать первым. На официальном сайте об этом ни слова, более того, там написано это:
The rewrite engine may be used in .htaccess files and in <Directory> sections, with some additional complexity.
Although rewrite rules are syntactically permitted in <Location> and <Files> sections, this should never be necessary and is unsupported.
В интернетах пишут, что mod_rewrite должен первым срабатывать, но такого не произошло, поместив правила в <Directory>   (они кста и без включения в него работают норм по себе).

среда, 8 августа 2012 г.

Apache 2.2 + SSL на Windows 7

Зачем это всё надо спросите вы? А вот понадобилось :)

Скачиваем

Итак. У нас есть Windsows 7. Осталось скачать Apache (httpd-2.2.22-win32-x86-no_ssl.msi) и OpenSSL (Win32OpenSSL-1_0_1c.exe)  или 2 в 1 — Apache с включенным OpenSSL (httpd-2.2.22-win32-x86-openssl-0.9.8t.msi).

Устанавливаем

Установку Apache описывать не буду. Там всё понятно.
Я вначале не знал, что можно воспользоваться OpenSSL включённым в Apache, поэтому качал отдельно. OpenSSL не установится без Visual C++ 2008 Redistributables.
Вкратце об OpenSSL:
OpenSSL — криптографический пакет с открытым исходным кодом для работы с SSL/TLS. Позволяет создавать ключи RSA, DH, DSA исертификаты X.509, подписывать их, формировать CSR и CRT. Также имеется возможность шифрования данных и тестирования SSL/TLS соединений.

Настраиваем

Сперва подключим модуль SSL в Apache и файл конфигурации SSL. Для этого откроем httpd.conf (например, c:\Program Files(x86)\Apache Software Foundation\Apache2.2\conf\httpd.conf) и раcкомментируем строки:
#LoadModule ssl_module modules/mod_ssl.so
#Include conf/extra/httpd-ssl.conf
Теперь создадим необходимые ключи и самозаверенный сертификат.

Создание ключей

Открываем командную строку с OpenSSL (c:\Program Files(x86)\Apache Software Foundation\Apache2.2\bin\openssl.exe) (можно, как обычно, в командной строке, но с командой openssl и указанием пути до неё). И укажите свой путь до openssl.cnf, возможно он совпадёт с моим:
OpenSSL> req -config ..\conf\openssl.cnf -new -out server.csr
Там можно ничего не вводить, кроме пароля - он дальше потребуется. A challenge password и An optial company name необходимо пропустить (не знаю зачем). В результате этой команды в нашей директории появятся два файла privkey.pem и server.csr.
Сгенерируем ключ сервера server.key (потребуется ввести пароль, который задали ранее):
OpenSSL> rsa -in privkey.pem -out server.key
Осталось сгенерировать сертификат, например на 365 дней:
OpenSSL> x509 -in server.csr -out server.crt -req -signkey server.key -days 365
Создадим отдельную папку для сертефикатов (c:\Program Files(x86)\Apache Software Foundation\Apache2.2\conf\cert) и переместим туда все получившиеся файлы server.key, privkey.pem, server.csr и server.crt.

Настраиваем дальше

в файле настройки SSL (c:\Program Files(x86)\Apache Software Foundation\Apache2.2\conf\extra\httpd-ssl.conf) меняем путь к server.crt:
SSLCertificateFile "C:/Program Files(x86)/Apache Software Foundation/Apache2.2/conf/cert/server.crt"
и к server.key:
SSLCertificateKeyFile "C:/Program Files(x86)/Apache Software Foundation/Apache2.2/conf/cert/server2.key"
Перезапускаем Apache ииии...
Вариант 1: сервер перезапустился, https://localhost работает.
Вариант 2: ничего не работает! т.е. не запускается Apache. Пишет ошибку:
The requested operation has failed
Как у меня и случилось. Это и сподвигло написать статью на будущее.
Пока не сползал в error.log, не понял в чём дело. А проблема известная и даже описана в вики apache, и предложено несколько решений.

Проблема

В httpd-ssl.conf есть такой пункт:
SSLSessionCache  "shmcb:C:/Program Files(x86)/Apache Software Foundation/Apache2.2/logs/ssl_scache(512000)"
Windows 64-bit устанавливает 32-bit приложения в Program Files(x86), ошибка как раз из-за этих скобок.

Решение

Я создал ярлык Apache для C:/Program Files(x86)/Apache Software Foundation/Apache2.2/ и поместил его в корень.
Затем в той строке, где возникает ошибка, изменил путь с применением ярлыка:
SSLSessionCache  "shmcb:C:/Apache/logs/ssl_scache(512000)"
Перезапускаем Apache. Заходим на https://localhost, работает!

Винда есть винда - грабли везде.