针对特定请求的RewriteRule + HTTPS重定向

时间:2016-01-03 13:30:36

标签: apache .htaccess mod-rewrite redirect https

我已设置from multiprocessing import Process, Lock, cpu_count class multiprocessingExample(): global d d = {} global lock lock = Lock() def __init__(self): pass def proc(self, num): global lock global d with lock: if(num in d): d[num] = d[num] + 1 else: d[num] = 1 print("P " + str(num) + ": " + str(d)) def main(self): jobs = [] for i in range(0, 10): if(i%2 == 0): p = Process(target=self.proc, args=(i,)) jobs.append(p) for job in jobs: job.start() for job in jobs: job.join() print("All: " + str(d)) obj = multiprocessingExample() obj.main() 文件来处理具有特定规则的用户请求以及包含其他规则的一般请求:

htaccess

这很好用,并且正确处理了URL转换。我的目标是强制所有用户通过HTTPS发送请求。我正在尝试按照RewriteHTTPToHTTPS中的说明设置重定向规则。我知道这不是推荐的解决方案,但我的服务器似乎不支持# users requests (i.e. users/login.html) RewriteRule ^users/([^/]+)\.html$ mvc.php?rt=users/$1 [L,QSA,NC] # generic requests (controller/action/id.html) RewriteRule ^([^/]+)/([^/]+)/([^/]+)\.html$ mvc.php?rt=$1/$2&id=$3 [L,QSA,NC] # generic requests (controller/action/) RewriteRule ^([^/]+)/([^/]+)/$ mvc.php?rt=$1/$2 [L,QSA,NC] # generic requests (controller/id.html) RewriteRule ^([^/]+)/([^/]+)\.html$ mvc.php?rt=$1&id=$2 [L,QSA,NC] # generic requests (controller.html) RewriteRule ^([^/]+)\.html$ mvc.php?rt=$1 [L,QSA,NC] RewriteRule ^$ mvc.php?rt=index [L,QSA,NC] 语句。这是我的代码:

VirtualHost

不幸的是,这似乎不起作用,因为我需要在所有规则之后插入# users http to https RewriteCond %{HTTPS} !=on RewriteRule ^users(.*) https://%{SERVER_NAME}/users$1 [R,L] 标志,这会导致处理在满足规则时停止。因此,如果首先在L中插入http-to-https规则,则会满足此规则并忽略用户特定规则(反之亦然)。

有没有办法两者:

  1. 使用特定规则处理用户请求
  2. 强制用户通过HTTPS发送请求
  3. 使用htaccess规则?

1 个答案:

答案 0 :(得分:1)

出于多种原因,我的建议是: - 在所有http请求上执行301重定向到https - 在所有https回答中使用HSTS

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

<VirtualHost *:80>
       ServerAlias *
       RewriteEngine On
       RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>

在443虚拟主机中:     标题总是设置Strict-Transport-Security“max-age = 31536000; includeSubDomains; preload”

警告:仅当https适用于所有网页时,才设置严格传输安全性。如果您不确定,可以在开始时尝试3600(10分钟)。 “includeSubDomains”将用于所有子域的https,“preload”将允许您的网站添加到浏览器的预加载列表中。

如果您有登录页面,请不要忘记cookie上的安全属性(如果没有它,cookie也将与不安全的http请求一起发送)。

为什么? - 因为没有HSTS,有人可以强制浏览器向http://example.com/mysecurepage发出请求,然后在回答301之前拦截http请求,并回复与您回复的页面相同的页面,而不是使用http链接。这种攻击称为sslstrip,唯一可以阻止它的是HSTS(preloaded如果可能的话) - 如果您忘记在cookie上添加安全属性,HSTS会保护您(但并非所有浏览器都知道HSTS,这就是使用安全属性仍然很重要的原因!) - 因为很容易错过哪些页面必须标记为安全:  如果页面要求提供个人数据(电子邮件,姓名等),那么在大多数欧洲国家,您有义务获得该数据;有时,页面不会询问个人数据,而是显示它;有时页面内容是公开的并不意味着访问者接受任何人都知道他访问它。 - 使用HTTP2和SPDY加密页面可以比未加密页面更快地提供服务:https://istlsfastyet.com/