У меня есть эта проблема, когда я получаю ответ при попытке использовать rest api: «Доступ к выборке в 'https://kollektivet.app:8082/api/login/' из источника 'https://kollektivet.app' заблокирован политикой CORS: ответ на предварительный запрос не проходит проверку контроля доступа: Перенаправление не допускается для предварительного запроса ".
Изображение ответа при попытке получить
Это происходит, когда я пробую любой из остальных api, которые использую. Из того, что я прочитал, эта ошибка означает, что я пытаюсь перенаправить, а это не так.
Бэкэнд - это Django, он выглядит так:
@csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def register(request,):
password = request.data.get("password", "")
email = request.data.get("email", "")
if not email and not password and not email:
return Response(
data = {
"message": "username, password and email is required to register a user"
},
status=status.HTTP_400_BAD_REQUEST
)
new_user = User.objects.create_user(
email=email, password=password
)
return Response(status=status.HTTP_201_CREATED)
И интерфейс реагирует, что выглядит так:
createUser(event) {
event.preventDefault();
let data = {
name: this.state.name,
password: this.state.password,
repeatPassword: this.state.repeatPassword,
email: this.state.email
};
if (this.state.name !== '' && this.state.password !== '' && this.state.email !== '' && this.checkPasswords()) {
console.info('name', this.state.name, 'password ', this.state.password, 'email ', this.state.email);
fetch("https://kollektivet.app:8082/api/register/", {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
mode: "cors",
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.info(data))
.catch(error => console.info(error));
this.setState({message: "Du er nå registrert! For å aktivere din konto trykk på linken som vi har sendt til deg på epost"});
this.setState({name: ""});
this.setState({password: ""});
this.setState({repeatPassword: ""});
this.setState({email: ""});
}
}
У меня есть файл настроек Django:
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
Я использую это на apache2, если это актуально. Порт 8082 тоже закрыт. Должен ли он быть открытым, когда он находится на том же сервере?
Спасибо!





Вас перенаправляют на site.site.comapi / register /
У вас есть другое промежуточное ПО, которое это делает? Может в конфиге Apache?
Обратите внимание, что это 301, поэтому ваш браузер кэшировал этот ответ и теперь всегда будет перенаправлять туда, даже если вы переместили код, который привел к этому перенаправлению, или даже если вы остановите запуск Django.
Таким образом, вам также необходимо очистить кеш перенаправления в браузере.
Вот почему мне не нравятся ответы 301. 302 намного вежливее.
У меня была такая же проблема, и я заметил, что было автоматическое перенаправление с www.example.com на example.com. Это фактически блокировало запрос.
У меня была такая же проблема, пока я не обнаружил, что перенаправление было вызвано структурой интернационализации Django, где все URL-адреса получают расширение URL-адреса i18n, такое как /en/path_to_resource, когда на самом деле был запрошен path_to_resource. В рамках интернационализации это достигается за счет переадресации 302.
Решение этой проблемы - оставить URL-адреса rest-api за пределами раздела с i18n_patterns. В результате urls.py может выглядеть так:
urlpatterns = [
path('i18n/', include('django.conf.urls.i18n')),
path('rest/', include(('rest.urls', 'rest'), namespace='rest')),
]
urlpatterns += i18n_patterns(
path('admin/', admin.site.urls),
path('jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),
path('my_app/', include(('my_app.urls', 'my_app'), namespace='my_app')),
)
Просто пишу здесь свою историю на случай, если у кого-то может быть такая же проблема, как у меня.
По сути, это проблема на стороне сервера, поэтому не нужно ничего менять во внешнем интерфейсе.
For this error message, it indicated that the OPTIONS requests got a response with the status code in either 301 Moved Permanently", "307 Temporary Redirect", or "308 Permanent Redirect".
Проверьте запрошенный URL с атрибутом 'location' из ответа OPTIONS, чтобы узнать, совпадают они или нет.
Для меня проблема заключалась в том, что мой URL-адрес запроса - **"https://server.com/getdata"**
но URL-адрес, который я установил на сервере, был **"https://server.com/getdata/"**
затем сервер дает мне 308, чтобы исправить это с помощью '/', это работает для POST, GET и HEAD, но не для OPTIONS.
Я использую flask, flask_restful и flask_cors.
использование этого также решит эту проблему перенаправления для меня.
app.url_map.strict_slashes = False
Используйте инструменты разработчика браузера, чтобы получить точный код состояния HTTP и заголовки ответа для ответа на предварительный запрос OPTIONS, а затем используйте stackoverflow.com/posts/53215045/edit для редактирования / обновления вопроса и вставки этого кода состояния HTTP и этих заголовков ответов.