我有一个运行在apache 2.2.14上的django Web应用程序,我想通过https运行管理应用程序。
在阅读了有关使用代理,编写中间件,运行替代wsgi脚本的大量讨论之后,#httpd中的人们开始拯救我。解决方案非常简单,我很惊讶我没有在网上找到它,所以我很想知道我是否做了一些明显的假设或错误。
一个复杂因素是我还希望通过https在网站上运行我的一个django应用程序,这就是/ checkout上的所有内容。
基本上,如果用户在http上请求以/ admin或/ checkout开头的URI,则会将其重定向到该URI,但需要重定向到https。相反,如果用户在https上请求不以/ admin或/ checkout开头的URI,则会将其重定向到该URI,但是会重定向到http。
解决此问题的关键是在我的VirtualHost配置中使用Redirect和RedirectMatch指令。
<VirtualHost *:80>
... host config stuff ...
Redirect /admin https://www.mywebsite.com/admin
Redirect /checkout https://www.mywebsite.com/checkout
</VirtualHost>
<VirtualHost *:443>
... ssl host config stuff ...
RedirectMatch ^(/(?!admin|checkout).*) http://www.mywebsite.com$1
</VirtualHost>
答案 0 :(得分:3)
另一种方法是使用@secure_required decorator
。这将自动重写请求的网址并重定向到网址的https://...
版本。然后,您不必在*:80
配置中进行重定向。如果您希望其他流量通过正常的http流量,则可能仍需要*:443
配置用于性能目的。
答案 1 :(得分:1)
我尝试了你的解决方案,但遇到了几个问题。首先,管理站点上的格式消失了,就好像它找不到管理静态文件一样。其次,如果我试图通过https访问非管理员站点,浏览器将找不到它并将我重定向到Yahoo搜索。奇怪的是,如果我编辑雅虎搜索URL以消除除正确URL(减去http://
)之外的所有文本,它将继续搜索yahoo以查找我的网站。但是,重新输入完全相同的URL会将我发送到我的网站。
我只需删除
即可解决所有这些问题RedirectMatch ^(/(?!admin|checkout).*) http://www.mywebsite.com$1
指令。
我应该提一下,我的网站上没有/ checkout部分,我只是想保护/管理员。 ...是的,我确实将我的网址替换为“mywebsite.com”
答案 2 :(得分:0)
您所描述的内容应该有效,但如果您需要更改哪些路径不是HTTPS,则将来可能会出现问题。因为此方法需要正确修改Apache配置文件的能力,这意味着您不在循环中需要新手。拧紧配置文件,您的网站可以在眨眼间出现500错误。
我们选择了一个简单的文本文件,其中包含必须为HTTPS的路径列表。项目中的任何人都可以对其进行编辑,并在加载时检查其是否正确。我们在中间件中处理任何需要重定向到HTTPS的重定向,它似乎工作得很好。如果您运行其他而不是Apache。
,此方法也可以使用