Skip to content

Instantly share code, notes, and snippets.

@dhaupin
Last active June 23, 2020 16:21
Show Gist options
  • Save dhaupin/cbaeeb488a342cc3df66 to your computer and use it in GitHub Desktop.
Save dhaupin/cbaeeb488a342cc3df66 to your computer and use it in GitHub Desktop.
Function - Route reverse proxy SSL flags, rewrite REMOTE_ADDR, and add PROTOCOL index
<?php
// Rewrite client IP based on proxy headers
$ip_pool = array(
!empty($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : '',
!empty($_SERVER['HTTP_CF_PSEUDO_IPV4']) ? $_SERVER['HTTP_CF_PSEUDO_IPV4'] : '',
!empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : '',
!empty($_SERVER['HTTP_X_FORWARDED']) ? $_SERVER['HTTP_X_FORWARDED'] : '',
!empty($_SERVER['HTTP_FORWARDED_FOR']) ? $_SERVER['HTTP_FORWARDED_FOR'] : '',
!empty($_SERVER['HTTP_FORWARDED']) ? $_SERVER['HTTP_FORWARDED'] : '',
!empty($_SERVER['HTTP_FORWARDED_IP']) ? $_SERVER['HTTP_FORWARDED_IP'] : '',
!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) ? $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] : '',
!empty($_SERVER['HTTP_X_COMING_FROM']) ? $_SERVER['HTTP_X_COMING_FROM'] : '',
!empty($_SERVER['HTTP_COMING_FROM']) ? $_SERVER['HTTP_COMING_FROM'] : '',
!empty($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : '',
!empty($_SERVER['HTTP_VIA']) ? $_SERVER['HTTP_VIA'] : ''
);
route_ip($ip_pool);
function route_ip($ip_pool) {
$valid_regex = "/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/";
foreach ($ip_pool as $proxy) {
preg_match($valid_regex, $_SERVER['REMOTE_ADDR'], $valid_addr);
preg_match($valid_regex, $proxy, $valid_ip);
if (isset($proxy) && !empty($valid_addr) && !empty($valid_ip) && $valid_addr[0] != $valid_ip[0]) {
$_SERVER['REMOTE_ADDR'] = $valid_addr[0];
$_SERVER['REMOTE_PROXY'] = $valid_ip[0];
break;
}
}
}
// Rewrite HTTPS mode based on proxy headers
$ssl_pool = array(
!empty($_SERVER['PROTOCOL']) ? $_SERVER['PROTOCOL'] : $_SERVER['PROTOCOL'] = 'http://',
!empty($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : $_SERVER['HTTPS'] = false,
!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) ? $_SERVER['HTTP_X_FORWARDED_PROTO'] : '',
!empty($_SERVER['HTTP_X_FORWARDED_PROTOCOL']) ? $_SERVER['HTTP_X_FORWARDED_PROTOCOL'] : '',
!empty($_SERVER['HTTP_X_FORWARDED_SSL']) ? $_SERVER['HTTP_X_FORWARDED_SSL'] : '',
!empty($_SERVER['HTTP_FRONT_END_HTTPS']) ? $_SERVER['HTTP_FRONT_END_HTTPS'] : '',
!empty($_SERVER['HTTP_X_URL_SCHEME']) ? $_SERVER['HTTP_X_URL_SCHEME'] : '',
!empty($_SERVER['HTTP_X_HTTPS']) ? $_SERVER['HTTP_X_HTTPS'] : '',
!empty($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : ''
);
route_ssl($ssl_pool);
function route_ssl($ssl_pool) {
foreach ($ssl_pool as $ssl) {
if (isset($ssl) && ($ssl == 'https' || $ssl == 'on' || $ssl == 1 || $ssl == 443)) {
$_SERVER['HTTPS'] = true; // Could be "on" or "1" depending on platform
$_SERVER['PROTOCOL'] = $_SERVER['PROTO'] = 'https://';
break;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment