Почему мой сайт работает нормально при локальном тестировании, но sessionid не может быть сохранен при использовании доменного имени?
помогите мне!!!!
Мой проект backend - django, а frontend использует react.
Локальное тестирование с localhost работает нормально.
Когда я выхожу в интернет на сервере и настраиваю доменное имя apache, sessionid не может быть автоматически сохранен. Я перепробовал множество методов, но они недоступны.
Но я обнаружил, что если я не использую прокси-сервер apache, он работает нормально, если я использую ip напрямую, и sessionid также может быть сохранен. В чем причина этого? Код, который я разместил ниже.
Настройки Django
INSTALLED_APPS = [
'whitenoise.runserver_nostatic',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'django_crontab',
'command_app',
'djcelery',
'corsheaders'
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware'
]
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
# CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOWED_ORIGINS = [
'http://react server ip:3000',
'https://react server ip:3000',
'http://localhost:3000',
'http://server ip:3000',
'https://server ip:3000',
'http://www.my domain name.com',
'https://www.my domain name.com',
'http://my domain name.com:3000',
'https://my domain name.com:3000',
'http://my domain name.com',
'https://my domain name.com',
]
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ("CustomAuthentication", )
}
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)
CACHES = {
'default': {
'BACKEND': "django_redis.cache.RedisCache",
"LOCATION": "redis://localhost:6379/3", # TODO 3
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
Django View
class LoginAPI(generics.GenericAPIView):
authentication_classes = (SessionAuthentication, )
serializer_class = LoginSerializer
def post(self, request):
print(request.session.session_key)
print(f"LoginAPI IsLogin: {request.user.is_authenticated}")
if request.user.is_authenticated:
return HttpResponse(dumps({'message': 'Login!'}), content_type='application/json', status=status.HTTP_200_OK)
serializer = self.get_serializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
except ValidationError:
return HttpResponse(status=status.HTTP_401_UNAUTHORIZED)
user = serializer.validated_data
login(request, user)
return HttpResponse(dumps({'message': 'Logout Success!'}),
content_type='application/json', status=status.HTTP_200_OK)
def get(self, request):
print(request.session.session_key)
if request.user.is_authenticated:
return HttpResponse(dumps({'message': 'Login!'}), content_type='application/json', status=status.HTTP_200_OK)
else:
return HttpResponse(dumps({'message': 'Not Login!'}), content_type='application/json', status=status.HTTP_401_UNAUTHORIZED)
def my_logout(request):
print(request.session.session_key)
print(f"my_logout Is Login: {request.user.is_authenticated}")
logout(request)
return HttpResponse(dumps({'message': 'Logout Success!'}), content_type='application/json', status=status.HTTP_200_OK)
urls.py
urls.py
urlpatterns = [
path('login/', LoginAPI.as_view()), # new web
path('logout/', my_logout), # new web
]
Код реакции
Код Apache
<VirtualHost *:80>
ServerAdmin webmaster@user.com
DocumentRoot /home/ec2-user/project_path
ServerName www.my domain name.com
ServerAlias my domain name.com
ProxyPass / http://localhost:8048/
ProxyPassReverse / http://localhost:8048/
</VirtualHost>
Измените ALLOWED_HOSTS на ALLOWED_HOSTS = ['*'].
По своей прихоти я назначил поддомены для frontend и backend. Гарантируется ли при этом гомологичность. Я отправил запрос в этом случае, и обнаружил, что доменное имя бэкенда успешно сохраняет sessionid, и успешно определяет статус входа в следующем запросе. Хотя это очень странно, это удовлетворяет мои потребности.