CORS - 如何在Apache的httpd.conf中忽略OPTIONS预检请求的身份验证?

use*_*087 8 apache ajax .htaccess cors

我是CORS的新手,并且已经了解到浏览器发送的OPTIONS预检请求会排除用户凭据.如何让过滤器(在httpd.conf中)以不同的方式响应OPTIONS请求,即绕过身份验证?

这是我目前的配置:

<LocationMatch /api>
SetEnvIfNoCase Origin "https://(www\.)?(domain1\.com|domain2\.com)(:\d+)?$" AccessControlAllowOrigin=$0
Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header set Access-Control-Allow-Credentials "true"
Header set Access-Control-Allow-Methods "GET,POST,DELETE,OPTIONS"
Header set Access-Control-Allow-Headers "Accept, Authorization, Origin, Content-Type"
AuthFormProvider ldap
AuthLDAPURL "ldap://localhost:10889/ou=Users,dc=work,dc=com?uid"
AuthLDAPGroupAttribute member
AuthLDAPGroupAttributeIsDN on
Require valid-user
ErrorDocument 401 /login.html
ErrorDocument 500 /error.html
AuthType form
AuthName realm
Session On
SessionMaxAge 1800
SessionDBDCookieName session path=/
ProxyPass  http://localhost:8080 timeout=31536000
AuthFormFakeBasicAuth On
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

以及发出请求的javascript:

$.ajax({
        type : "DELETE",
        url : "https://www.domain1.com/api",
        xhrFields: {
            withCredentials: true,
        },
        success : function(data){

        },
});
Run Code Online (Sandbox Code Playgroud)

我尝试了以下但没有运气:

(一个)

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]
Run Code Online (Sandbox Code Playgroud)

(b)中

<Limit OPTIONS>
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Credentials "false"
Header always set Access-Control-Allow-Headers "Accept, Authorization, Origin, Content-Type"
Header always set Access-Control-Allow-Methods "GET,POST,DELETE,OPTIONS,PUT"
</Limit>
Run Code Online (Sandbox Code Playgroud)

(C)

<Limit OPTIONS>
Allow for all
</Limit>
Run Code Online (Sandbox Code Playgroud)

(d)

SetEnvIfNoCase Request_Method OPTIONS allowed
Run Code Online (Sandbox Code Playgroud)

任何的想法 ?请帮忙 !

小智 6

我有同样的问题,我今天在这个问题的帮助下解决了这个问题.基本上你的选择c.

我的conf结构是:

conf/httpd.conf <- normal stuff   
conf.d/ssl.conf <- set up ssl stuff  
conf.d/api.conf <- set specific stuff to api like Auth  
/var/www/.htaccess <- set specific stuff to api again   
Run Code Online (Sandbox Code Playgroud)

这允许限制除OPTIONS之外的所有内容

/conf.d/api.conf 文件:

<Directory "/var/www/api">
  AllowOverride All
  Options FollowSymLinks

  <LimitExcept OPTIONS>
    Auth stuff here
    Mainly your Require statements
  </LimitExcept>
</Directory>
Run Code Online (Sandbox Code Playgroud)

然后在我的.htaccess文件中设置标题.

require指令中的Apache手册指出"以这种方式应用的访问控制对所有方法都有效.这是通常所希望的.如果您希望仅对特定方法应用访问控制,同时保留其他方法不受保护,则放置将Require语句放入<Limit>[或<LimitExcept>]部分."

我必须确保我的应用程序可以处理OPTIONS,因为此设置没有自动返回.在这里这里可以看到如何重定向哪个可能有效,而不是在应用程序中有东西处理它.