diff options
author | ArthurHoaro <arthur@hoa.ro> | 2016-02-28 16:24:18 +0100 |
---|---|---|
committer | ArthurHoaro <arthur@hoa.ro> | 2016-02-28 16:24:18 +0100 |
commit | 85244fa0d06eec620f8476817f68d8ea2dca0e38 (patch) | |
tree | 0513dad3f290e1e5d41c0760d24aa96a7590c2ce | |
parent | 8710d4da8e21b31a90bdcaed10521e0b937cf6c2 (diff) | |
download | Shaarli-85244fa0d06eec620f8476817f68d8ea2dca0e38.tar.gz Shaarli-85244fa0d06eec620f8476817f68d8ea2dca0e38.tar.zst Shaarli-85244fa0d06eec620f8476817f68d8ea2dca0e38.zip |
Fixes #477: support multi reverse proxy with comma syntax
Going through multiple reverse proxy will store multiple scheme and port in HTTP header separated by a comma. Shaarli will use the first one to generate server_url.
-rw-r--r-- | application/HttpUtils.php | 14 | ||||
-rw-r--r-- | tests/HttpUtils/ServerUrlTest.php | 13 |
2 files changed, 25 insertions, 2 deletions
diff --git a/application/HttpUtils.php b/application/HttpUtils.php index e2c1cb47..af7cb371 100644 --- a/application/HttpUtils.php +++ b/application/HttpUtils.php | |||
@@ -106,11 +106,21 @@ function server_url($server) | |||
106 | // Shaarli is served behind a proxy | 106 | // Shaarli is served behind a proxy |
107 | if (isset($server['HTTP_X_FORWARDED_PROTO'])) { | 107 | if (isset($server['HTTP_X_FORWARDED_PROTO'])) { |
108 | // Keep forwarded scheme | 108 | // Keep forwarded scheme |
109 | $scheme = $server['HTTP_X_FORWARDED_PROTO']; | 109 | if (strpos($server['HTTP_X_FORWARDED_PROTO'], ',') !== false) { |
110 | $schemes = explode(',', $server['HTTP_X_FORWARDED_PROTO']); | ||
111 | $scheme = trim($schemes[0]); | ||
112 | } else { | ||
113 | $scheme = $server['HTTP_X_FORWARDED_PROTO']; | ||
114 | } | ||
110 | 115 | ||
111 | if (isset($server['HTTP_X_FORWARDED_PORT'])) { | 116 | if (isset($server['HTTP_X_FORWARDED_PORT'])) { |
112 | // Keep forwarded port | 117 | // Keep forwarded port |
113 | $port = ':'.$server['HTTP_X_FORWARDED_PORT']; | 118 | if (strpos($server['HTTP_X_FORWARDED_PORT'], ',') !== false) { |
119 | $ports = explode(',', $server['HTTP_X_FORWARDED_PORT']); | ||
120 | $port = ':' . trim($ports[0]); | ||
121 | } else { | ||
122 | $port = ':' . $server['HTTP_X_FORWARDED_PORT']; | ||
123 | } | ||
114 | } | 124 | } |
115 | 125 | ||
116 | return $scheme.'://'.$server['SERVER_NAME'].$port; | 126 | return $scheme.'://'.$server['SERVER_NAME'].$port; |
diff --git a/tests/HttpUtils/ServerUrlTest.php b/tests/HttpUtils/ServerUrlTest.php index 5096db65..8a55a220 100644 --- a/tests/HttpUtils/ServerUrlTest.php +++ b/tests/HttpUtils/ServerUrlTest.php | |||
@@ -67,6 +67,19 @@ class ServerUrlTest extends PHPUnit_Framework_TestCase | |||
67 | ) | 67 | ) |
68 | ) | 68 | ) |
69 | ); | 69 | ); |
70 | |||
71 | $this->assertEquals( | ||
72 | 'https://host.tld:4974', | ||
73 | server_url( | ||
74 | array( | ||
75 | 'HTTPS' => 'Off', | ||
76 | 'SERVER_NAME' => 'host.tld', | ||
77 | 'SERVER_PORT' => '80', | ||
78 | 'HTTP_X_FORWARDED_PROTO' => 'https, https', | ||
79 | 'HTTP_X_FORWARDED_PORT' => '4974, 80' | ||
80 | ) | ||
81 | ) | ||
82 | ); | ||
70 | } | 83 | } |
71 | 84 | ||
72 | /** | 85 | /** |