预检请求不允许重定向

时间:2018-11-08 19:43:53

标签: django reactjs cors apache2 django-cors-headers

我遇到这个问题,尝试使用rest api时得到响应:“ CORS策略阻止从原点“ https://kollektivet.app:8082/api/login/”到“ https://kollektivet.app”处的访问:对预检请求未通过访问控制检查:预检请求不允许重定向。”

Picture of response when trying to fetch

当我尝试使用其余的任何api时,就会发生这种情况。从我阅读的内容来看,此错误表示我正在尝试重定向,但不是。

后端是Django,看起来像这样:

JTable

前端处于反应状态,如下所示:

    @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)

我确实是Django设置文件:

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.log('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.log(data))
                    .catch(error => console.log(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: ""});

        }
    }

如果相关,我正在apache2上运行它。 端口8082也关闭。当它在同一台服务器上时,是否需要将其打开?

谢谢!

3 个答案:

答案 0 :(得分:1)

您将被重定向到site.site.comapi / register /

您还有其他一些中间件吗?也许在Apache配置中?

请注意,它是301,因此您的浏览器已经缓存了此响应,并且即使您漫游导致该重定向的代码,或者即使您停止运行Django,现在也将始终重定向到该响应。

因此,您还需要在浏览器中清除重定向缓存。

这就是为什么in不喜欢301的原因。 302更有礼貌。

答案 1 :(得分:1)

只要在这里写下我的故事,以防有人遇到与我相同的问题。

基本上,这是服务器端的问题,因此无需在前端进行任何更改。

对于此错误消息,它表明OPTIONS请求得到了一个 状态码在“ 301已永久移动”,“ 307 临时重定向”或“ 308永久重定向”。

请使用OPTIONS响应中的'location'属性检查您请求的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

答案 2 :(得分:0)

我遇到了同样的问题,直到我发现重定向是由Django国际化框架引起的,在该框架中,当实际请求/en/path_to_resource时,所有URL都得到一个i18n url扩展名,例如path_to_resource。国际化框架通过302重定向实现了这一目标。

此问题的解决方案是使用i18n_patterns将rest-api网址保留在该部分之外。生成的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')),
)