2011-08-05 11 views
5

मुझे HTTPS के माध्यम से कार्यरत स्थिर फ़ाइलों तक पहुंचने पर 404 त्रुटियां मिल रही हैं लेकिन स्थैतिक फ़ाइलें HTTP के माध्यम से ठीक काम करती हैं।HTTPS के माध्यम से Django स्थिर फ़ाइलों को कैसे सेवा दें?

स्पष्ट होने के लिए, मैं किसी विशेष पृष्ठ को दोनों तरीकों से एक्सेस कर सकता हूं उदा। http://domain.com/page और https://domain.com/page लेकिन HTTPS मामले में, छवियां लोड होने में विफल हो जाएंगी।

इसके अलावा, एक छवि सीधे तक पहुँचने http://domain.com/static/image.png काम करता है लेकिन https://domain.com/static/image.png रिटर्न 404.

मैं apache2 पर mod_wsgi का उपयोग कर Django 1.3 के साथ उबंटू 10.04 चला रहा हूँ।

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:

यहाँ प्रासंगिक फ़ाइलें (WSGI और prod.conf और secure_prod.conf और settings.py) कर रहे हैं .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> 

सेटिंग्स.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 मिलता है? यदि आपको अपाचे 404 मिलता है, तो आपका सुरक्षित उत्पादन conf शायद अपराधी है। यदि आपको डीजेंगो 404 मिलता है, तो मिलान गलत लगता है। – leech

उत्तर

4

आपको अपने सभी स्थिर मीडिया और व्यवस्थापक फ़ाइलों को भी उपनाम करने की आवश्यकता है।

फिलहाल आप पोर्ट 80 और 443 पर Django की सेवा कर रहे है, लेकिन साइट मीडिया सिर्फ पोर्ट 80 पर बस secure_production.conf

+0

इसलिए मुझे जॉर्डन के समान समस्या थी और यह मुझे दो से तीन घंटे तक फिसल गया। मैंने https://mysite.com को आजमाया और कोई स्थिर फाइल नहीं देखी। आखिरकार जब मैंने स्वचालित रीडायरेक्ट को https पर हटा दिया और फिर HTTP की जांच की .. सभी स्थिर फाइलें http के साथ काम करती हैं। तो आपके समाधान के लिए धन्यवाद ..मुझे बस उबंटू पर डिफ़ॉल्ट-एसएसएल साइट पर उपनाम/स्थैतिक/पथ/से/my/static जोड़ने की आवश्यकता थी और यह काम करना शुरू कर दिया! – harijay

2

आपका 443 आभासी मेजबान में उर्फ ​​नियमों और स्थान वर्गों कॉपी उपयोग नहीं किया जा सकता है क्योंकि अगर यह mod_wsgi कुछ कारणों से शिकायत करेगा। पहला कारण यह है कि 'डोमेन-प्रोडक्शन' का उपयोग WSGIDaemonProcess के लिए कई बार किया जाता है जो mod_wsgi अनुमति नहीं देगा क्योंकि संपूर्ण अपाचे उदाहरण में नाम अद्वितीय होना चाहिए। दूसरा, 443 संदर्भों में WSGIProcessGroup 'domain_production_secure' जिसके लिए कोई WSGIDaemonProcess समूह निर्देश नहीं है।

आपको यह सत्यापित करने की आवश्यकता है कि वास्तव में कौन सी फाइलें पढ़ी जा रही हैं। आप फ़ाइलों में एक वाक्यविन्यास त्रुटि पेश करके ऐसा कर सकते हैं और देख सकते हैं कि अपाचे शिकायत करते हैं या कॉन्फ़िगरेशन करते समय शिकायत करते हैं या नहीं।

यदि आप जो पोस्ट कर रहे हैं उसे संशोधित कर रहे हैं, तो कृपया ऐसा करने की कोशिश न करें, क्योंकि आपके द्वारा किए गए किसी भी बदलाव से यह अर्थ बदल जाता है कि इसे डीबग करना कठिन हो जाता है।

बीटीडब्ल्यू, आपकी कॉन्फ़िगरेशन में कुछ चीजें विरासत में मिली हैं जिन्हें mod_wsgi के लिए आवश्यक नहीं है और केवल mod_python के लिए आवश्यक है। आपको वापस जाना चाहिए और mod_wsgi दस्तावेज़ों को संशोधित करना चाहिए और इन चीजों को साफ़ करना चाहिए। विशेष रूप से पायथन अंडे कैश के लिए SetEnv mod_wsgi और SetHandler के लिए काम नहीं करता है mod_wsgi के साथ कोई भी आवश्यक नहीं है। अपाचे एक्सेस कंट्रोल निर्देशों के आस-पास स्थान निर्देशों का उपयोग करना भी बुरा व्यवहार है। इसके बजाय निर्देशिका निर्देश का उपयोग करके भौतिक निर्देशिकाओं पर लागू करें।

संबंधित मुद्दे

 संबंधित मुद्दे