Wyzwanie #
Podczas korzystania z CloudFlare lub Nginx Reverse Proxy z Laravel, często otrzymujemy adresy IP proxy CloudFlare lub serwera proxy zamiast rzeczywistych adresów IP użytkowników. Naprawmy to.
Przegląd rozwiązania #
- Skonfiguruj Nginx do przekazywania nagłówków rzeczywistego IP
- Skonfiguruj Laravel do zaufania proxy
- Zaktualizuj kod, aby otrzymywać prawidłowe adresy IP
Konfiguracja Nginx #
Użyłem npm - Nginx Proxy Manager do skonfigurowania Nginx uruchomionego w Dockerze. Link: Nginx Proxy Manager
Dodaj do swojego npm:
proxy_set_header CF-Connecting-IP $http_cf_connecting_ip;
Zaufane proxy w Laravel #
Zaktualizuj app/Http/Middleware/TrustProxies.php
dodając zaufane proxy CloudFlare
protected $proxies = [
'173.245.48.0/20',
'103.21.244.0/22',
'103.22.200.0/22',
'103.31.4.0/22',
'141.101.64.0/18',
'108.162.192.0/18',
'190.93.240.0/20',
'188.114.96.0/20',
'197.234.240.0/22',
'198.41.128.0/17',
'162.158.0.0/15',
'104.16.0.0/13',
'104.24.0.0/14',
'172.64.0.0/13',
'131.0.72.0/22',
];
protected $headers = Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO;
Pobieranie rzeczywistych adresów IP #
// Najlepsza metoda
$realIP = request()->ip();
Przykład implementacji #
Pozwól użytkownikom firmowym z określonych zakresów IP na dostęp do tablicy informacyjnej firmy.
Dodaj do
routes/web.php
Route::get('/company-board', function (Request $request) {
// Pobierz rzeczywisty IP
$currentIp = request()->ip();
// Pobierz dozwolone adresy IP
$allowedIps = array_filter(
array_map('trim', explode(',', env('COMPANY_IPS', ''))),
fn($ip) => !empty($ip)
);
// Sprawdź dostęp IP
if (!in_array($currentIp, $allowedIps)) {
abort(403, 'Ta tablica jest dostępna tylko z sieci firmowej');
}
return view('company.board');
})->name('company.board');
Dodaj firmowe adresy IP do .env
:
COMPANY_IPS=<company_ip_1>, <company_ip_2>, <company_ip_3>
Utwórz prosty widok dla tablicy firmowej
resources/views/company/board.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="card">
<div class="card-header">
<h3 class="card-title">Witaj na tablicy firmowej</h3>
</div>
<div class="card-body">
<div class="text-center p-4">
<h4>Witaj Firmo!</h4>
<p class="text-muted">Przeglądasz to z firmowego adresu IP</p>
</div>
</div>
</div>
</div>
@endsection
Podsumowanie #
Dzięki odpowiedniej konfiguracji Laravel, CloudFlare i Nginx możesz bezpiecznie zarządzać rzeczywistymi adresami IP użytkowników w swojej aplikacji.