Я столкнулся со странной ситуацией, на которую я не мог найти правильный ответ.
Я использую какой-то API, где я могу отправлять ответы на определенные запросы из того же корневого домена.
Мой api находится в субдомене (https://api.mysite.com) И есть несколько клиентских фреймворков в PHP
, Такие как
Я хочу, чтобы этот API был доступен только из того же корневого домена. Поэтому я добавил заголовки AccessControlAllowOrigin, которые работают неплохо.
Но проблема в том, что я также хочу убедиться, что никто не может получить доступ к этому API, потому что CORS основан на браузере, и я могу легко получить доступ к этому API из других инструментов, таких как POSTMAN.
Вот почему я добавил код в свой .htaccess
так что только из того же IP может получить доступ к моей системе.
Вот мой файл .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
flag вообще ничего не блокирует.
Если кто-то сталкивается с такой же проблемой, спасибо @Panama Jack за ответ в SO, вот как я это сделал.
SetEnvIf Referer "example\.com" canpass
SetEnvIf Referer "^mobile\.example\.com" canpass2
Require env canpass
Require env canpass2
Здесь оригинальный ответ.
Попробуйте что-то вроде этого, чтобы разрешить соединения только с локального IP (IP вашего сервера):
Require local
И для авторизации внешних IP:
Require ip your_authorized_ip
Это новые обозначения Apache2.4. Видеть документы управления доступом Apache2.4 для более подробной информации / конфигурации.