我正面临一个奇怪的情况,但我找不到正确的答案。
我正在使用某种 API,可以通过它向来自同一根域的某些请求发送响应。
我的 api 位于子域中(https://api.mysite.com) 中还有一些客户端框架PHP
,例如
- 我的站点
- mobile.mysite.com
- admin.mysite.com
我只希望这个 API 可以从同一个根域访问。因此我添加了 AccessControlAllowOrigin 标头,效果很好。
但问题是,我还想确保没有人可以访问此 API,因为 CORS 是基于浏览器的,并且我可以轻松地从其他工具(例如 POSTMAN)访问此 API。
这就是为什么我添加了一些代码,.htaccess
以便只有来自同一个知识产权可以访问我的系统。
这是我的.htaccess 文件。
php_flag display_errors on
php_value error_reporting 9999
SetEnvIf Origin "http(s)?://(www\.)?(mysite.com|mobile.mysite.com|admin.mysite.com)$" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header merge Vary Origin
RewriteEngine On
RewriteBase /
order allow,deny
deny from all
allow from // MY IP HERE
<RequireAny>
Require ip allow from // MY IP HERE
</RequireAny>
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
# DirectoryIndex none.none
# Options -Indexes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
但问题是系统本身会阻塞,我的意思是当我尝试使用访问我的 API 时AJAX Request
,会出现如下错误:
Failed to load resource: the server responded with a status of 403 ()
我错过了什么。
谢谢。
PS
Require ip allow from // MY IP HERE
标志根本没有阻止任何东西。
答案1
尝试以下类似操作来仅允许来自本地 IP(您的服务器的 IP)的连接:
Require local
并授权外部 IP:
Require ip your_authorized_ip
这些是新的 Apache2.4 符号。请参阅Apache2.4 访问控制文档以获取更多详细信息/配置。
答案2
如果有人遇到同样的问题,感谢@Panama Jack 在 SO 中给出的答案,以下是我的做法。
SetEnvIf Referer "example\.com" canpass
SetEnvIf Referer "^mobile\.example\.com" canpass2
Require env canpass
Require env canpass2
这里是原始答案。