У меня есть веб-сервер 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>
контейнер, указывающий на правильное место в вашей файловой системе. В противном случае перенаправление может работать должным образом, но файл не обязательно будет найден (в зависимости от других значений конфигурации).