.htaccess 如何修复节点API通过Apache服务器调用时的CORS错误

iaqfqrcu  于 2022-11-16  发布在  Apache
关注(0)|答案(2)|浏览(223)

我为127.0.0.1添加了虚拟主机abc.local

  1. Angular应用程序正在localhost:4000上运行
  2. localhost:80上的PHP API
  3. localhost:4060上的节点1 API
  4. localhost:3001上的节点2 API
    PHP文件位于**/admin/webp文件夹中,节点文件分别位于/admin/webp/v2/admin/webp/v1文件夹中。
    下面是
    .htaccess**文件
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
    Header set Access-Control-Allow-Credentials "true"
    Header set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding, X-Auth-Token, content-type"
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^abc.local$
    RewriteRule ^admin/webp/v2/(.*)$ http://localhost:4060/$1 [L,R=301]
    RewriteRule ^admin/webp/v1/(.*)$ http://localhost:3001/v1/$1 [L]
</IfModule>

所有重写规则都正常工作。例如,对abc.local/webp/v2/users的所有调用都被重定向到localhost:4060/users
但是,浏览器因规则而抛出CORS错误
RewriteRule ^admin/webp/v2/(.*)$ http://localhost:4060/$1 [L,R=301]
Apache服务器使用301重定向响应节点应用程序的OPTIONS请求(浏览器需要200)。是否有解决方法?

pu82cl6c

pu82cl6c1#

如果有人遇到同样的问题,只需将[L,R=301]替换为[L,P](请求被视为代理而不是重定向)。

RewriteRule ^admin/webp/v2/(.*)$  http://localhost:4060/$1 [L,P]

RewriteRule ^admin/webp/v1/(.*)$  http://localhost:3001/v1/$1 [L,P]
wyyhbhjk

wyyhbhjk2#

(Your问题缺少一些细节,因此如果我做了错误的假设,请原谅我。)
如果您的应用要向http://abc.local/admin/webp/v2/users发出跨源请求,则类似Content-Type: application/json的请求标头将导致浏览器首先发出preflight request

OPTIONS http://abc.local/admin/webp/v2/users
Origin: http://localhost:4000
Access-Control-Request-Headers: Content-Type
... more Access-Control-Request-* headers ...

RewriteRule ^admin/webp/v2/(.*)$ http://localhost:4060/$1 [L,R=301]

Apache服务器使用重定向响应此OPTIONS请求

HTTP/1.1 301 Moved Permanently
Location: http://localhost:4060/admin/webp/v2/users
Access-Control-Allow-Origin: *
... other Access-Control-Allow-* headers ...

为了防止这种情况,您可以扩展RewriteCond,以便它将OPTIONS请求排除在重写之外,并使用200 OK响应它们。

相关问题