我在 Ubuntu Server 上运行了一个 apache 2 Web 服务器。我将整个服务器重定向到 SSL,并启用了以下站点:
<VirtualHost *:80>
ServerName hda.surfrock66.com/
Redirect permanent / https://hda.surfrock66.com/
</VirtualHost>
我有一个小而烦人的 php 文件,它允许从无法验证 SSL 的应用程序上传数据。有没有办法禁用单个网站上单个文件的 SSL,也许使用 .htaccess 之类的?我读过大量关于这个问题的文章,但没有一篇奏效,所以我只能从头开始寻求帮助。
谢谢!
答案1
当然,只需使用RewriteCond
mod_rewrite 即可将该特定路径排除在重定向之外。我一直这样做是为了支持通过 HTTP 发送的 Let's Encrypt ACME 请求,但将其他所有内容重定向到 HTTPS(并让 HTTPS 虚拟主机宣布 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
多个虚拟主机中,从而大大减少了配置文件中的重复)。
是的,它有点复杂,但用途也更广泛。请注意,参数RewriteCond
是正则表达式;此处加上前缀是!
因为我们要反转它的含义。(应用 RewriteRule 的条件是 RewriteCond才不是匹配,从而排除该位置。)
另外,请确保容器DocumentRoot
中有一个<VirtualHost>
指向文件系统中正确位置的 。否则,重定向可能会按预期工作,但不一定能找到该文件(取决于其他配置值)。