You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下Apache部署Django的SSL连接配置及站点访问异常排查

问题拆解与分步修复方案

咱们一步步来解决你遇到的三个核心问题:HTTPS访问时暴露文件目录结构、HTTP与HTTPS无法同时正常服务,以及Apache端口与Django路径的配置对齐。

1. 解决HTTPS显示文件结构的问题

当前配置下Apache列出目录,大概率是这几个原因导致的,咱们逐个排查修复:

  • 先禁用目录索引模块:如果mod_autoindex模块启用,当没有默认索引文件时,Apache就会自动列出目录。执行以下命令禁用它:
    sudo a2dismod autoindex
    sudo systemctl restart apache2
    
  • 检查WSGI配置文件的有效性:你设置的WSGIScriptAlias / /var/www/html/django/django.wsgi必须指向一个正确配置的wsgi文件。如果这个文件不存在或者配置错误,Apache就无法加载Django,转而显示目录。标准的django.wsgi内容应该是这样的(替换你的项目名为实际Django项目名称):
    import os
    import sys
    sys.path.append('/var/www/html/django')
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名.settings')
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    
  • 修正静态文件Alias配置:你当前把/static/指向了/template/,这明显不对——Django的静态文件应该对应collectstatic命令生成的静态文件目录,一般是/var/www/html/django/static/。修改这部分配置:
    Alias /static/ "/var/www/html/django/static/"
    <Directory "/var/www/html/django/static/">
        Order deny,allow
        Allow from all
        Require all granted
    </Directory>
    
  • 在目录配置中禁用索引:在Django项目的Directory块里明确加上Options -Indexes,强制Apache不显示目录列表:
    <Directory /var/www/html/django>
        WSGIProcessGroup example.com
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
        Require all granted
        Options -Indexes  # 禁止目录列表
    </Directory>
    

2. 配置HTTP(8080端口)与HTTPS同时访问

你已经把Apache默认端口改成8080,但当前配置里只有443的VirtualHost,这就是两个协议无法同时访问的原因。咱们先调整端口监听,再添加8080的配置:

  • 修改Apache端口监听:编辑/etc/apache2/ports.conf,确保同时监听8080和443:
    Listen 8080
    Listen 443
    
  • 添加8080端口的VirtualHost:这里有两种方案,根据你的需求选择:

方案A:HTTP自动重定向到HTTPS(推荐)

这种方案更安全,也不用维护两份相同的配置,用户访问http://example.com:8080会自动跳转到https://example.com:

<VirtualHost *:8080>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

方案B:同时保留HTTP和HTTPS访问

如果必须同时提供两个协议的服务,就把HTTPS的配置复制一份到8080的VirtualHost,去掉SSL相关的配置项:

<VirtualHost *:8080>
    ServerName example.com

    WSGIDaemonProcess example.com threads=5
    WSGIScriptAlias / /var/www/html/django/django.wsgi
    WSGIProcessGroup example.com

    Alias /static/ "/var/www/html/django/static/"
    <Directory "/var/www/html/django/static/">
        Order deny,allow
        Allow from all
        Require all granted
    </Directory>

    <Location "/media">
        SetHandler None
    </Location>
    <LocationMatch "\.(jpg|gif|png|js|css)$">
        SetHandler None
    </LocationMatch>

    <Directory /var/www/html/django>
        WSGIProcessGroup example.com
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
        Require all granted
        Options -Indexes
    </Directory>
</VirtualHost>

3. 确保目录权限正确

Apache运行用户(通常是www-data)需要有Django项目目录的访问权限,执行以下命令修复权限:

sudo chown -R www-data:www-data /var/www/html/django
sudo chmod -R 755 /var/www/html/django

4. 验证配置并重启服务

所有修改完成后,先检查Apache配置是否有语法错误:

sudo apache2ctl configtest

如果输出Syntax OK,就重启Apache服务使配置生效:

sudo systemctl restart apache2

做完这些步骤后,HTTPS访问应该会正常加载Django内容而不是目录列表,同时HTTP(8080端口)也能正常工作(要么重定向,要么加载Django)。


内容的提问来源于stack exchange,提问作者Chandan Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:40:49