2010-01-22 27 views
15

Trong Django, tôi đã đặt SESSION_COOKIE_DOMAIN thành tên miền của mình. Nhưng tôi thực sự muốn chạy cùng một trang web với hai tên miền khác nhau.Django, SESSION_COOKIE_DOMAIN với nhiều tên miền

Với SESSION_COOKIE_DOMAIN được đặt, chỉ tên miền được đặt tên mới cho phép người dùng đăng nhập. Có thể cho phép cả hai tên miền đăng nhập?

Trả lời

24

Nếu bạn đặt tên miền cookie phiên của bạn để bắt đầu bằng "." ký tự này sẽ cho phép bạn xử lý các tên miền phụ ký tự đại diện và chia sẻ cookie phiên (phiên đăng nhập) trên nhiều tên miền phụ.

 
In settings.py: 
SESSION_COOKIE_DOMAIN=".stackoverflow.com" 

Ở trên sẽ cho phép cookie được chia sẻ trên user1.stackoverflow.com và user2.stackoverflow.com.

Nếu bạn thực sự muốn url khác nhau cho cùng một trang web, bạn có muốn cùng một người dùng chuyển đổi giữa hai trang web trên một phiên đăng nhập không? Hay bạn chỉ muốn khả năng có hai người dùng khác nhau đăng nhập vào trang web từ hai url khác nhau (không phải là tên miền phụ?)

+0

Tôi muốn thứ hai. Không phải là miền phụ. Về cơ bản tôi có một khách hàng có averylongdomainnamethatno-onewantstotype.net và quickname.net và trang web cần phải làm việc cho cả hai. – interstar

+3

Làm cách nào để thêm chuyển hướng từ 'longname.net' vào' shortname.net' để tất cả người dùng chỉ sử dụng 'shortname.net'? –

+0

Cũng sẽ hoạt động giữa 'example.com' và' www.example.com'. –

4

SessionMiddleware chuẩn chỉ hỗ trợ một SESSION_COOKIE_DOMAIN, điều này chỉ tốt cho một tên miền và tên miền phụ của chúng.

Đây là biến thể sẽ đặt tên miền cookie động dựa trên máy chủ yêu cầu. Để sử dụng nó, chỉ cần cập nhật MIDDLEWARE_CLASSES của bạn để sử dụng một SessionHostDomainMiddleware, thay vì SessionMiddleware. Điều này tốt hơn, @jcdyer và @interstar?

import time 

from django.conf import settings 
from django.utils.cache import patch_vary_headers 
from django.utils.http import cookie_date 
from django.contrib.sessions.middleware import SessionMiddleware 

class SessionHostDomainMiddleware(SessionMiddleware): 
    def process_response(self, request, response): 
     """ 
     If request.session was modified, or if the configuration is to save the 
     session every time, save the changes and set a session cookie. 
     """ 
     try: 
      accessed = request.session.accessed 
      modified = request.session.modified 
     except AttributeError: 
      pass 
     else: 
      if accessed: 
       patch_vary_headers(response, ('Cookie',)) 
      if modified or settings.SESSION_SAVE_EVERY_REQUEST: 
       if request.session.get_expire_at_browser_close(): 
        max_age = None 
        expires = None 
       else: 
        max_age = request.session.get_expiry_age() 
        expires_time = time.time() + max_age 
        expires = cookie_date(expires_time) 
       # Save the session data and refresh the client cookie. 
       # Skip session save for 500 responses, refs #3881. 
       if response.status_code != 500: 
        request.session.save() 
        host = request.get_host().split(':')[0] 
        response.set_cookie(settings.SESSION_COOKIE_NAME, 
          request.session.session_key, max_age=max_age, 
          expires=expires, domain=host, 
          path=settings.SESSION_COOKIE_PATH, 
          secure=settings.SESSION_COOKIE_SECURE or None, 
          httponly=settings.SESSION_COOKIE_HTTPONLY or None) 
     return response 
+0

Những gì anh ta yêu cầu là chính xác trường hợp sử dụng khung trang web được thiết kế để phù hợp. Đề xuất "không làm điều đó", không hữu ích. – jcdyer

+0

Trên thực tế không có @jcdyer, với SESSION_COOKIE_DOMAIN được thiết lập, anh ta sẽ không thể sử dụng vani SessionMiddleware và khung công tác trang web. – s29

0

Thay vì có một hoàn chỉnh mới SessionMiddleware bạn có thể thay đổi các tập tin cookie phản ứng như sau:

class CrossDomainSessionMiddleware(object): 
    def process_response(self, request, response): 
     if response.cookies: 
      host = request.get_host() 
      # check if it's a different domain 
      if host not in settings.SESSION_COOKIE_DOMAIN: 
       domain = ".{domain}".format(domain=host) 
       for cookie in response.cookies: 
        if 'domain' in response.cookies[cookie]: 
         response.cookies[cookie]['domain'] = domain 
     return response 

(Đặt phần mềm trung gian này lên Middle Middleware Session) Bạn có thể hạn chế điều này cho các miền cụ thể nếu muốn.

Các vấn đề liên quan