文件夹存在时允许来源不起作用

Allow-Origin does not work when folder exists

例如,考虑由 http:///localhost/htaccess-test 上的 apache2 提供的页面。

文件夹可能如下所示:

htaccess-test
 |- .htaccess
 |- index.php

这是.htaccess:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, PATCH, OPTIONS"

RewriteEngine on
RewriteRule ^ index.php [QSA,L]

每个呼叫都会被重定向到 index.php 并由 PHP(或其他)从那里处理。

现在在不同的端口或主机上生成一个客户端:

<html>
<body>
    <script>
      (function() {
        const xhttp = new XMLHttpRequest();
        xhttp.open("PUT", "http://localhost/htaccess-test/foo");
        xhttp.send();
      })();
    </script>
</body>
</html>

有效。但是,如果您将文件夹 'foo' 添加到页面的文件夹 ('htaccess-test'),调用会导致 CORS 错误!

谁能帮我避免这种情况!我有一个名为 'test' 的 Endpojnt,它与测试文件夹冲突...

xhttp.open("PUT", "http://localhost/htaccess-test/foo");

如果 /foo 是物理目录,则 mod_dir 将发出 301 重定向以附加尾部斜杠。重定向响应不会设置 CORS headers,因为您没有将 always 条件与 Header 指令一起使用,因此会出现 CORS 错误。

但是,我希望您首先不想要尾部斜线,因此您需要防止 mod_dir 附加尾部斜线。

.htaccess 文件的顶部添加以下内容:

# Prevent mod_dir appending a trailing slash to directories
DirectorySlash Off

但是,由于您要禁用目录斜杠,因此需要确保目录列表也被禁用,因为 DirectoryIndex 文档(在该目录中)的存在将不再阻止 mod_autoindex 生成目录列表(如果尾部斜杠被省略)。在 .htaccess 文件的顶部添加以下内容(如果您还没有):

# Prevent mod_autoindex from generating directory listings.
Options -Indexes

如果您需要直接访问任何目录,则需要根据需要手动附加尾部斜杠(使用外部重定向或内部重写)。