ReverseProxyMiddleware.php 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace Drupal\Core\StackMiddleware;
  3. use Drupal\Core\Site\Settings;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpKernel\HttpKernelInterface;
  6. /**
  7. * Provides support for reverse proxies.
  8. */
  9. class ReverseProxyMiddleware implements HttpKernelInterface {
  10. /**
  11. * The decorated kernel.
  12. *
  13. * @var \Symfony\Component\HttpKernel\HttpKernelInterface
  14. */
  15. protected $httpKernel;
  16. /**
  17. * The site settings.
  18. *
  19. * @var \Drupal\Core\Site\Settings
  20. */
  21. protected $settings;
  22. /**
  23. * Constructs a ReverseProxyMiddleware object.
  24. *
  25. * @param \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel
  26. * The decorated kernel.
  27. * @param \Drupal\Core\Site\Settings $settings
  28. * The site settings.
  29. */
  30. public function __construct(HttpKernelInterface $http_kernel, Settings $settings) {
  31. $this->httpKernel = $http_kernel;
  32. $this->settings = $settings;
  33. }
  34. /**
  35. * {@inheritdoc}
  36. */
  37. public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) {
  38. // Initialize proxy settings.
  39. static::setSettingsOnRequest($request, $this->settings);
  40. return $this->httpKernel->handle($request, $type, $catch);
  41. }
  42. /**
  43. * Sets reverse proxy settings on Request object.
  44. *
  45. * @param \Symfony\Component\HttpFoundation\Request $request
  46. * A Request instance.
  47. * @param \Drupal\Core\Site\Settings $settings
  48. * The site settings.
  49. */
  50. public static function setSettingsOnRequest(Request $request, Settings $settings) {
  51. // Initialize proxy settings.
  52. if ($settings->get('reverse_proxy', FALSE)) {
  53. $proxies = $settings->get('reverse_proxy_addresses', []);
  54. if (count($proxies) > 0) {
  55. $deprecated_settings = [
  56. 'reverse_proxy_header' => Request::HEADER_X_FORWARDED_FOR,
  57. 'reverse_proxy_proto_header' => Request::HEADER_X_FORWARDED_PROTO,
  58. 'reverse_proxy_host_header' => Request::HEADER_X_FORWARDED_HOST,
  59. 'reverse_proxy_port_header' => Request::HEADER_X_FORWARDED_PORT,
  60. 'reverse_proxy_forwarded_header' => Request::HEADER_FORWARDED,
  61. ];
  62. $all = $settings->getAll();
  63. // Set the default value. This is the most relaxed setting possible and
  64. // not recommended for production.
  65. $trusted_header_set = Request::HEADER_X_FORWARDED_ALL | Request::HEADER_FORWARDED;
  66. foreach ($deprecated_settings as $deprecated_setting => $bit_value) {
  67. if (array_key_exists($deprecated_setting, $all)) {
  68. @trigger_error(sprintf("The '%s' setting in settings.php is deprecated in Drupal 8.7.0 and will be removed before Drupal 9.0.0. Use the 'reverse_proxy_trusted_headers' setting instead. See https://www.drupal.org/node/3030558", $deprecated_setting), E_USER_DEPRECATED);
  69. $request::setTrustedHeaderName($bit_value, $all[$deprecated_setting]);
  70. if ($all[$deprecated_setting] === NULL) {
  71. // If the value is NULL do not trust the header.
  72. $trusted_header_set &= ~$bit_value;
  73. }
  74. }
  75. }
  76. $request::setTrustedProxies(
  77. $proxies,
  78. $settings->get('reverse_proxy_trusted_headers', $trusted_header_set)
  79. );
  80. }
  81. }
  82. }
  83. }