2011-08-05 2 views
5

Я получаю 404 ошибки при доступе к статическим файлам, обслуживаемым через HTTPS, но статические файлы работают нормально через HTTP.Как обслуживать статические файлы Django через HTTPS?

Чтобы быть ясным, я могу получить доступ к определенной странице в обоих направлениях, например. http://domain.com/page и https://domain.com/page, но в случае HTTPS изображения не загружаются.

Кроме того, доступ изображения непосредственно http://domain.com/static/image.png работает, но https://domain.com/static/image.png возвращает 404.

Я бегу Ubuntu 10.04 с Django 1.3 с использованием mod_wsgi на apache2.

Вот соответствующие файлы (WSGI и prod.conf и secure_prod.conf и settings.py):

django.wsgi

import os 
import sys 
import site 

sys.stdout = sys.stderr # Allows use of print statements 

PROJECT_ROOT = '/home/code/domain/src/domain-project/' 
site_packages = '/home/code/domain/lib/python2.6/site-packages' 

site.addsitedir(os.path.abspath(site_packages)) 
sys.path.insert(0, PROJECT_ROOT) 
sys.path.insert(1, os.path.join(PROJECT_ROOT, "domain")) 
sys.path.insert(2, site_packages) 
os.environ['DJANGO_SETTINGS_MODULE'] = 'domain.settings' 
os.environ['PYTHON_EGG_CACHE'] = '/home/administrator/.python-eggs' 
os.environ["CELERY_LOADER"] = "django" 

import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 

# Load a monitor to automatically reload apache when files change 
import domain.monitor 
domain.monitor.start(interval=1.0) 

production.conf

<VirtualHost *:80> 

    # Admin email, Server Name (domain name) and any aliases 
    ServerAdmin [email protected] 
    ServerName domain.com 
    ServerAlias *.domain.com 

    DocumentRoot /home/code/domain/src/domain-project/domain 
    LogLevel warn 
    WSGIDaemonProcess domain-production processes=5 maximum-requests=500 threads=100 
    WSGIProcessGroup domain-production 
    WSGIScriptAlias//home/code/domain/src/domain-project/apache/production.wsgi 

    SetEnv PYTHON_EGG_CACHE /home/apache/.python_eggs 

    Alias /admin/media /home/code/domain/lib/python2.6/site-packages/django/contrib/admin/media 
    Alias /site_media /home/code/domain/src/domain-project/static 
    Alias /static /home/code/domain/src/domain-project/static 
    Alias /robots.txt /home/code/domain/src/domain-project/static/robots.txt 
    Alias /favicon.ico /home/code/domain/src/domain-project/static/favicon.ico 

    <Location /admin/media> 
    SetHandler None 
    Order allow,deny 
    Allow from all 
    </Location> 

    <Location /site_media> 
    SetHandler None 
    Order allow,deny 
    Allow from all 
    </Location> 

    <LocationMatch "\.(jpg|gif|png|mp4)$"> 
    SetHandler None 
    </LocationMatch> 

    <LocationMatch "^/(robots\.txt|favicon\.ico|crossdomain\.xml)$"> 
    SetHandler none 
    </LocationMatch> 

    ErrorLog /var/log/apache2/domain/production_error.log 
    LogLevel info 
    CustomLog /var/log/apache2/domain/production_access.log combined 

</VirtualHost> 

secure_production .conf

<VirtualHost *:443> 

    ServerAdmin [email protected] 
    ServerName domain.com 
    ServerAlias *.domain.com 

    DocumentRoot /home/code/domain/src/domain-project/domain 
    LogLevel warn 
    WSGIDaemonProcess domain-production processes=5 maximum-requests=500 threads=100 
    WSGIProcessGroup domain_production_secure 
    WSGIScriptAlias//home/code/domain/src/domain-project/apache/production.wsgi 

    SSLEngine on 
    SSLOptions +StrictRequire 

    <Directory /> 
     SSLRequireSSL 
    </Directory> 

    SSLProtocol -all +TLSv1 +SSLv3 
    SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM 

    SSLCertificateFile /home/code/domain/src/domain-project/apache/key/domain.COM.crt 
    SSLCertificateKeyFile /home/code/domain/src/domain-project/apache/key/domain.com.key 
    SSLCertificateChainFile /home/code/domain/src/domain-project/apache/key/Apache_Plesk_Install.txt 
    SSLVerifyClient none 
    SSLProxyEngine off 

    <IfModule mime.c> 
     AddType application/x-x509-ca-cert  .crt 
     AddType application/x-pkcs7-crl   .crl 
    </IfModule> 


    SetEnv PYTHON_EGG_CACHE /home/apache/.python_eggs 


    Alias /admin/media /home/code/domain/lib/python2.6/site-packages/django/contrib/admin/media 
    Alias /site_media /home/code/domain/src/domain-project/static 
    Alias /static /home/code/domain/src/domain-project/static 
    Alias /robots.txt /home/code/domain/src/domain-project/static/robots.txt 
    Alias /favicon.ico /home/code/domain/src/domain-project/static/favicon.ico 


    <Location /admin/media> 
     SetHandler None 
     Order allow,deny 
     Allow from all 
    </Location> 

    <Location /site_media> 
     SetHandler None 
     Order allow,deny 
     Allow from all 
    </Location> 

    <LocationMatch "\.(jpg|gif|png|mp4)$"> 
     SetHandler None 
    </LocationMatch> 

    <LocationMatch "^/(robots\.txt|favicon\.ico|crossdomain\.xml)$"> 
     SetHandler none 
    </LocationMatch> 

    ErrorLog /var/log/apache2/domain/production_secure_error.log 
    LogLevel info 
    CustomLog /var/log/apache2/domain/production_secure_access.log combined 

</VirtualHost> 

settings.py

# Django settings for domain project. 
import os 

DEBUG = False 
TEMPLATE_DEBUG = DEBUG 

# create a relative path to anything on the project from the PROJECT PATH 
SETTINGS_PATH = os.path.dirname(os.path.abspath(__file__)) 
PROJECT_PATH = os.path.join(*os.path.split(SETTINGS_PATH)[:-1]) 
rel = lambda * args: os.path.join(PROJECT_PATH, *args) 

# Absolute path to the directory static files should be collected to. 
# Don't put anything in this directory yourself; store your static files 
# in apps' "static/" subdirectories and in STATICFILES_DIRS. 
# Example: "/home/media/media.lawrence.com/static/" 
STATIC_ROOT = rel('..', 'static') 

# URL prefix for static files. 
# Example: "http://media.lawrence.com/static/" 
STATIC_URL = '/static/' 

# Additional locations of static files 
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

# List of finder classes that know how to find static files in 
# various locations. 
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
# 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
) 

# List of callables that know how to import templates from various sources. 
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
#  'django.template.loaders.eggs.Loader', 
) 

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth', 
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.request', 
    'django.core.context_processors.static', 
) 


MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

ROOT_URLCONF = 'domain.urls' 

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    rel('..', 'templates'), 
) 

DJANGO_APPS= [ 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin', 
] 

THIRDPARTY_APPS = [ 
    'djcelery', 
    'djkombu', 
    #'sentry', 
    #'sentry.client', 
    #'south', 
] 

domain_APPS= [] 

INSTALLED_APPS = DJANGO_APPS + THIRDPARTY_APPS + domain_APPS 
+0

Получаете ли вы django 404 или apacho 404? Если вы получаете apache 404, то ваш защищенный продукт будет, вероятно, виновником. Если вы получите django 404, то совпадение, похоже, будет неправильным. – leech

ответ

4

Вы должны псевдоним всех статические средств массовой информации и администратор файлов, а также.

На данный момент вы, кажется, служит Джанго на порту 80 и 443, но сайт-СМИ только на порт 80. Просто скопируйте правила псевдонима и секции местоположение в secure_production.conf

+0

У меня была такая же проблема, как у Иордана, и это помогло мне в течение двух-трех часов. Я продолжал попытки https://mysite.com и не видел статических файлов. Наконец, когда я удалил автоматический переадресацию на https, а затем проверил http..все статические файлы, работающие с http. Так что благодаря вашему решению ..Мне просто нужно было добавить Alias ​​/ static/path/to/my/static также на сайт ssl по умолчанию на Ubuntu, и он начал работать! – harijay

2

Ваш 443 виртуального хоста не может привыкнуть, потому что если бы mod_wsgi жаловался по нескольким причинам. Первая причина заключается в том, что «domain-production» используется несколько раз для WSGIDaemonProcess, который mod_wsgi не разрешает, поскольку имя должно быть уникальным для всего экземпляра Apache. Во-вторых, WSGIProcessGroup в 443 ссылках «domain_production_secure», для которой не существует групповой директивы WSGIDaemonProcess.

Вам необходимо проверить, какие файлы на самом деле читаются. Вы можете сделать это, введя синтаксическую ошибку в файлы и посмотрев, жалуется ли Apache при запуске или настройке.

Если вы изменяете то, что публикуете, старайтесь не делать этого, так как любые изменения, которые вы делаете, изменяют смысл, затрудняют его отладку.

BTW, ваш конфиг унаследовал некоторые вещи, которые не нужны для mod_wsgi и нужны только для mod_python. Вы должны вернуться и пересмотреть документацию mod_wsgi и очистить эти вещи. В частности, SetEnv для кеша яиц Python не работает для mod_wsgi, а SetHandler None не требуется с mod_wsgi. Также неверно использовать директивы Location в отношении директив управления доступом Apache. Вместо этого применяйте их к физическим каталогам, используя директиву Directory.

Смежные вопросы