Назад | Перейти на главную страницу

Исключить файл на сервере Apache из SSL, когда сервер защищен перенаправлением perm?

У меня есть веб-сервер apache 2, работающий на сервере Ubuntu. У меня весь сервер перенаправляется на SSL со следующим включенным сайтом:

<VirtualHost *:80>
    ServerName hda.surfrock66.com/
    Redirect permanent / https://hda.surfrock66.com/
</VirtualHost>

У меня есть один маленький неприятный php-файл, который позволяет загружать данные из приложения, которое не может проверить SSL. Есть ли способ отключить ssl для одного файла на одном сайте, возможно, с помощью .htaccess или чего-то еще? Я прочитал обширные статьи по этому поводу, но ни одна из них не сработала, поэтому я застрял, прося помощи с нуля.

Спасибо!

Конечно, просто используйте RewriteCond с mod_rewrite, чтобы исключить этот конкретный путь из перенаправления. Я делаю это все время, чтобы поддерживать запросы Let's Encrypt ACME через HTTP, но перенаправлять все остальное на HTTPS (и чтобы HTTPS vhost объявлял HSTS в интересах клиентов).

Однако я не понимаю вашего варианта использования. Скрипт PHP действительно не должен заботиться о транспорте.

Попробуйте что-нибудь подобное в своем <VirtualHost> контейнер вместо этого Redirect строфа:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/excluded/url.php$
RewriteRule  ^/(.*)  https://%{HTTP_HOST}/$1  [last,redirect=301]

Это приведет к перенаправлению (с использованием 301 переехал навсегда код ответа) все Кроме /excluded/url.php в соответствующее место на том же имени хоста по HTTPS. С помощью %{HTTP_HOST} вместо явного имени хоста означает, что тот же фрагмент конфигурации можно использовать в любом контейнере виртуального хоста (у меня есть мой в отдельном файле фрагмента, который я Include в ряде vhosts, значительно сокращая повторение в файлах конфигурации).

Да, это немного сложнее, но при этом гораздо более универсально. Обратите внимание, что аргумент RewriteCond регулярное выражение; с префиксом здесь ! потому что мы инвертируем его значение. (Условием применения RewriteRule является то, что RewriteCond не совпадение, таким образом исключая это одно местоположение.)

Также убедитесь, что у вас есть DocumentRoot в <VirtualHost> контейнер, указывающий на правильное место в вашей файловой системе. В противном случае перенаправление может работать должным образом, но файл не обязательно будет найден (в зависимости от других значений конфигурации).

документация по mod_rewrite