【发布时间】:2015-08-26 00:34:57
【问题描述】:
我对 domain.com 和 upload.domain.com 使用 Laravel5.1,相同的脚本(复制粘贴并更改配置文件中的站点 url)。
会话域设置为 .domain.com 并且在 upload.domain.com 上我已将所有 CORS 标头添加到 upload.domain.com 和 ajax 帖子工作正常,并使用数据库进行会话。
我有以下 nginx 配置:
location /upload {
add_header Access-Control-Expose-Headers Accept-Ranges;
add_header Access-Control-Expose-Headers Content-Encoding;
add_header Access-Control-Expose-Headers Content-Length;
add_header Access-Control-Expose-Headers Content-Range;
add_header accept_ranges bytes;
upload_state_store /tmp;
upload_resumable on;
add_header Pragma no-cache;
add_header X-Content-Type-Options nosniff;
#add_header Cache-control "no-story, no-cache, must-revalidate";
# Access control for CORS
{ ....}
add_header X-CSRF-Token $HTTP_X_CSRF_TOKEN;
add_header X-XSRF-TOKEN $HTTP_X_CSRF_TOKEN;
upload_set_form_field "_token" $HTTP_X_CSRF_TOKEN;
client_max_body_size 4096m;
upload_pass /internal_upload;
upload_pass_args on;
upload_store /storage/uploaded 1;
upload_store_access user:r group:r all:r;
upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";
upload_cleanup 400 404 499 500-505;
}
位置 /internal_upload {
proxy_pass http://upload.domain.com/fileupload/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
在执行 XHR2 请求时,我使用以下方式通过标头传递令牌:
xhr.setRequestHeader("X-CSRF-Token", globalObj._token );
xhr.setRequestHeader("X-XSRF-TOKEN", globalObj._token );
最后问题出在最后一步,当 nginx 将数据传递到子域上的后端应用程序时,会抛出令牌不匹配异常。
我还注意到 domain.com 设置了一个名为 X-XSRF-TOKEN 的 cookie,并使用 domain.com 作为域名,upload.domain.com 设置了另一个带有域名 upload.domain.com 的 X-XSRF-TOKEN 令牌。这是否正常,因为两个应用程序都设置了 X-XSRF-TOKEN 并且值不相等,我猜这可能是问题所在,或者可能是 nginx 剥离了一些数据然后将它们传递到后端?
【问题讨论】:
标签: php ajax nginx laravel-5 csrf