我有一个 django Web 应用程序,其中允许通过 http 访问某些 URL,而其他 URL 只能通过 http-secure 访问。我需要在我的 apache conf 文件中设置 virtualHost/mod_wsgi 配置,以便可以通过两者访问相同的 Web 应用程序。我关注了这两个帖子
并具有以下配置,我认为应该可以解决问题。
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin me@mail.com
DocumentRoot /var/www/html
ServerName www.mydomain.com
ErrorLog server-logs/error_log
CustomLog server-logs/access_log common
WSGIScriptAlias /test /var/www/my_app_root/apache/django.wsgi
<Directory /var/www/my_app_root>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
NameVirtualHost *:443
<VirtualHost *:443>
SSLEngine On
SSLCertificateFile /etc/httpd/conf/ssl/mykey.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/mykey.key
ServerAdmin me@mail.com
DocumentRoot /var/www/html
ServerName www.mydomain.com
ErrorLog server-logs/error_log
CustomLog server-logs/access_log common
WSGIScriptAlias /test /var/www/my_app_root/apache/django.wsgi
<Directory /var/www/my_app_root>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
但是,必须通过 http 访问的 url 可以毫无问题地访问,而必须通过 https 访问的 url 会出现 404 - not found 错误。我有一个装饰器,它查看是否正在通过 http 访问视图,然后重定向到将 http 替换为 https 的 url。所以 url-mapping 是正确的,因为我看到重定向发生(这意味着视图被调用)但是通过 https,它得到 404 错误。
我在网络服务器文档根目录中有一个第 3 方 php 应用程序,/var/www/html/
它在 https 上运行良好。不知何故,该应用程序在 http 或 https 上没有遇到任何问题。
我尝试了以下
- 尝试在两个虚拟主机中使用相同
WSGIProcessGroup
名称的守护程序模式方法,但这也没有成功。 - 我尝试添加 Listen 443 命令,并且 apache 抱怨端口已绑定错误。
编辑:
由于您的所有评论,我对配置进行了更多探索,发现有一个子配置文件在运行时被拉入,它定义了 *:443 虚拟主机(并且没有 wsgiscript 指令)。这就是Listen 443
抛出错误的原因。这也解释了 https 上 url 的 404(处理 *:443 的虚拟主机无法解析该 url)。现在我对其进行了修改,一切正常。我最初问题的 2 个堆栈溢出帖子中建议的方法是完美的并且可以正常工作。