Skip to content

Commit aff7bdd

Browse files
committed
Merge branch 'kirtangajjar-add_www_redirect' into develop
2 parents 6d7596e + 7ea4992 commit aff7bdd

File tree

5 files changed

+285
-2
lines changed

5 files changed

+285
-2
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ before_script:
1616
echo "xdebug.ini does not exist"
1717
fi
1818
- ./ci/prepare.sh
19+
- ./ci/add-test-certs.sh
1920

2021
script:
2122
- cd "$TRAVIS_BUILD_DIR/../easyengine"
@@ -27,4 +28,4 @@ after_script:
2728
notifications:
2829
email:
2930
on_success: never
30-
on_failure: change
31+
on_failure: change

ci/add-test-certs.sh

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#!/usr/bin/env bash
2+
sudo mkdir -p /opt/easyengine/nginx/certs
3+
4+
cat <<EOF | sudo tee /opt/easyengine/nginx/certs/example2.test.crt
5+
-----BEGIN CERTIFICATE-----
6+
MIIDAzCCAeugAwIBAgIJAOfjYN/2twJzMA0GCSqGSIb3DQEBBQUAMBgxFjAUBgNV
7+
BAMMDWV4YW1wbGUyLnRlc3QwHhcNMTgwNzEzMDgyMzEwWhcNMjgwNzEwMDgyMzEw
8+
WjAYMRYwFAYDVQQDDA1leGFtcGxlMi50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOC
9+
AQ8AMIIBCgKCAQEA4nSZucxge7AoPQAT9x6q9wd99/Of/5Pg9wimq9F/hI41jKT/
10+
Go24Cjz4+qlBk1vhT9huGfGPvtU939mkEdbtuvYX1qft2LEDK/TAUFtJCXEz/qKP
11+
ndFWyFhOxcKaD8lsbBW9ZuE+qK1Zjc2x4LKESmi6dAk0fgcIKxy8o1C3hFVnW8Mi
12+
A1bzlrTZMJl9McFaLGjtEkIBAXdk0Z9xA7Vl29AWXBkRR16WpEDhxPIR5s4qKiqv
13+
1I32Xaeh7R8NVIm+glMfo4C+b03/hdt6FmDvmvoKjBuFOs8156NMShIeYrzOxv18
14+
wJTLrJXYVjiUDylcaTZhP0a1xp3feOPweS+7gwIDAQABo1AwTjAdBgNVHQ4EFgQU
15+
YhlFd4zw174kiNnDQM39QS5fkk0wHwYDVR0jBBgwFoAUYhlFd4zw174kiNnDQM39
16+
QS5fkk0wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAk3b7fwUkG1P+
17+
9SzU+BGXBy/VjMeCqtraZSeKKHBnqZK1AsL7osXY+/k2k5VMZNfHyOjATCpwNc06
18+
rhK115aHKcMpzNfaogN1xwb4/TWzC7pp9QNFJkDsIKxPBa9aYuSBlvXfKK1BOS49
19+
XaNC5cOdqNV5kJOU3zSqYu0P5M65rRnUQwaOvOtqknxAgsVQcfzQVfl3vFSlGMcA
20+
qlKifxwYo77dUp2rucY418bh2sFUIzaIFiB2cxqfOkDa70RSye5aJStvG4mxImAF
21+
WlZrjFDu7AwkoQSD0rkwSoOwEmrwXAAjlfGueDIq/bBLPiTptPy3zIyutT0JHV2b
22+
lgkJtDRf0A==
23+
-----END CERTIFICATE-----
24+
EOF
25+
26+
cat <<EOF | sudo tee /opt/easyengine/nginx/certs/example2.test.key
27+
28+
-----BEGIN RSA PRIVATE KEY-----
29+
MIIEogIBAAKCAQEA4nSZucxge7AoPQAT9x6q9wd99/Of/5Pg9wimq9F/hI41jKT/
30+
Go24Cjz4+qlBk1vhT9huGfGPvtU939mkEdbtuvYX1qft2LEDK/TAUFtJCXEz/qKP
31+
ndFWyFhOxcKaD8lsbBW9ZuE+qK1Zjc2x4LKESmi6dAk0fgcIKxy8o1C3hFVnW8Mi
32+
A1bzlrTZMJl9McFaLGjtEkIBAXdk0Z9xA7Vl29AWXBkRR16WpEDhxPIR5s4qKiqv
33+
1I32Xaeh7R8NVIm+glMfo4C+b03/hdt6FmDvmvoKjBuFOs8156NMShIeYrzOxv18
34+
wJTLrJXYVjiUDylcaTZhP0a1xp3feOPweS+7gwIDAQABAoIBAFrDNxXj10vbx9Tj
35+
Ih1qukU2SIPHrnoGMCVy3zKATia3xLixLNncsUXROE1m5zSDn+ObsE1PpzhqSVld
36+
5seLqE7F8boEJm0yTT4h466RV82kBJ3rU7qCO9Eiq7fRjmQDbCRJ9la0sqNyjzEp
37+
n0Ca7DDSluCJC/PzJ4/3/ZdLc7Jis0a8Klpp2OzjXsApywSindKsC4GqLCWG/ZCA
38+
yncAjN8BiSoUU/cd96ckqnDTgXyx5tFZSWwVNG7hb77Y/Kes9Z4oaZNCGaLGxurI
39+
89WPfGeEvqN0GG+S3TjUxs+n9iZvTKa/6o3eT1TH6C1eWBQoEj9EoM8Mrx/K+zYB
40+
JAj6cMkCgYEA/KBCB8Oj+4XL3+21MsFUkgQKQm8FRCp29N5YxlTmcnSBgasvfHXR
41+
WTIEojPuABjHDyO5HKJANybFN/3pq1OgWVVg4n2ubi11HOGI5lsslXpGTuwF7fXn
42+
hyb07Q4Ohd/assrSB43RPKXJ1F6cbpOC/YpSQzD3Wra2Hv1m70u8dCUCgYEA5Xrd
43+
M7grFgSvg63072+ZnnsOhdva9QnidR7i4IWri2hWCO+pnhAwu4owJdKCj4vvlVN+
44+
vAJqR0TImaD/uc8m61a8slF1Ndi42lyrtWYgwMh1sBqB3uzsoDln3NjokmCLH/OC
45+
fLvucIBACHoaz8zpQQFiNhfEw9FnGA+Jk57tzIcCgYAT9a2B44k/RDD5flSEsBW4
46+
e6071n26BwjjC/ZDpU2X2XCqCBZ2ZPCndXY8QpIZW9vObGohwwgD04JdjCg8Kx1O
47+
MZq4CmoPtnO8Vm10lduN691GOwu042rpmMBdQnEPTsJ+wduaUTAo9IhfySHe8rS0
48+
x4r8WBATEMCO7kKFwZwgKQKBgG6lGeipAOVB5xp3kqSry4b1UGBMTDtfw7ey57NX
49+
4Al8ihcO71qN9eFG1MY3xMnPr/nw4ydlhrbMPGiOjx6Y+ev4y0yzJ++Jij+G9Sem
50+
kV5CiTQa48mHtOPgKer7DtAdCpeiQqU/u8y0mas8rJbK9yBnuWHZff7ohWu9ehka
51+
RRAbAoGAa+qjNQapv6XCNeAmunhDgMBzRZhTLZrLSvdNflenEuMpkgrkHbgJJnrG
52+
Yvr8i0kojvoKofYPoqvno/S5ZM2QLIVCP28HkXhVSv63doMm3pcibiAagHpNYLa9
53+
4uwN640uFpqt7JCSOlJP7w4zx5BKXU9D9FRwri7QivBpmBHpVLk=
54+
-----END RSA PRIVATE KEY-----
55+
EOF
56+
57+
cat <<EOF | sudo tee /opt/easyengine/nginx/certs/www.example3.test.crt
58+
-----BEGIN CERTIFICATE-----
59+
MIIDAzCCAeugAwIBAgIJAJo9QUktB2TOMA0GCSqGSIb3DQEBBQUAMBgxFjAUBgNV
60+
BAMMDWV4YW1wbGUzLnRlc3QwHhcNMTgwNzEzMDgyMjUxWhcNMjgwNzEwMDgyMjUx
61+
WjAYMRYwFAYDVQQDDA1leGFtcGxlMy50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOC
62+
AQ8AMIIBCgKCAQEAxjI414PGPUf9aRSmjVywFHMHLhJGF1+Lg3YimM9fKo1WqD4T
63+
2mepdV9zOztUCGrszMNcpaltjf8nTSuNwEWUp9TQYufABavN3TvzNWnmT3Q5NIA0
64+
2v6SZVQUEskWwoDOqhudH8D6/Dk4m449UMKrN2VD3A61T6TtlkbiX6lX2e/8UfSH
65+
ECFZP/xAh68l/XgcsI46tfvBPDdQdSDYhFxIhRqWevOT2FVQjR63yL6uZ96SeiIH
66+
sntxjBnqaYTYwgN5Bjv1vbJwHqOMhZNnquVfxh/+EOd/gBQKBWiavC5HmjnVbjyT
67+
6V9GiGBMsdRfjf/pNjIaqjXMYyIEtFm2/SSaIQIDAQABo1AwTjAdBgNVHQ4EFgQU
68+
nrOjZu9o7IznjL5JHADGu/VLB7UwHwYDVR0jBBgwFoAUnrOjZu9o7IznjL5JHADG
69+
u/VLB7UwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAqhW1cDx4Owrj
70+
EUJkyKBxT6aDtWUdSP7SAvfl4pRz3wdpTT6TWc6t0s3X81tRYSX3on4L4dzfpp2/
71+
/Hgz6LlBIQ9thznE7WnUDE7VR6A0+Grc4po2Vq20z52LGzff/yKWx3PSVjL0f/IL
72+
HZ2t5YpI36nHNcJFEJWlckPkcDa8tX5tsDFr50luCsvuZBGYu6pnLWEZumL/QdHC
73+
UVMAKtWZxf9Via6aIKqsUNdBwq7gHdiZFYyi8NSCX2yD06LtIjBzDTn9Qsch6hSD
74+
utaxR66cXq8laVwyHc+Z+HkG/Y7GytDdKGYUTPB/lIhqpMrJJDcJLJz10yR8zBub
75+
ZLuoQMvF5Q==
76+
-----END CERTIFICATE-----
77+
EOF
78+
cat <<EOF | sudo tee /opt/easyengine/nginx/certs/www.example3.test.key
79+
-----BEGIN RSA PRIVATE KEY-----
80+
MIIEogIBAAKCAQEAxjI414PGPUf9aRSmjVywFHMHLhJGF1+Lg3YimM9fKo1WqD4T
81+
2mepdV9zOztUCGrszMNcpaltjf8nTSuNwEWUp9TQYufABavN3TvzNWnmT3Q5NIA0
82+
2v6SZVQUEskWwoDOqhudH8D6/Dk4m449UMKrN2VD3A61T6TtlkbiX6lX2e/8UfSH
83+
ECFZP/xAh68l/XgcsI46tfvBPDdQdSDYhFxIhRqWevOT2FVQjR63yL6uZ96SeiIH
84+
sntxjBnqaYTYwgN5Bjv1vbJwHqOMhZNnquVfxh/+EOd/gBQKBWiavC5HmjnVbjyT
85+
6V9GiGBMsdRfjf/pNjIaqjXMYyIEtFm2/SSaIQIDAQABAoIBABCX/dhVaRCSaW4V
86+
04f8XaWop848q2+jiTu9dVIT8qTOZpX5dJIRocd48V3hLrzxrtfJ94TLNafw1+qH
87+
HfweFz8h+zx8qMAQzVCbh1ZOgoDeezehEEvRipI/Qtr7yRMJ08O8QiB5eMoLRGkJ
88+
tKqBUfJ2YQMYnCeJ6HZvgt59gCR35FVzstXhAFTUPJP/kOyF/eIRGZNaBc3LZ5ah
89+
anWBcl+7OhcPBkYt8QCyPUFU9VxGyDe/Ei5VOasQAyfGQ92YMAPEYGH/uoND59G5
90+
Z7d+xvmzCEzaLFp2AsmZmvN3s3I4qUdOwSm9f2ajArUPURSybpnYoCdXvdbIWDqm
91+
v2jtxi0CgYEA+8ZHD07LVijalFaSc+IyOkpqs2ON3C7laljtd/tw2L5vC4gxggwC
92+
TkXNrJWAt/4icbc/SXjBcHF8f4Wkz7TVuKuA14XJYO2QMeFzB/wjuHam2cF6NWf0
93+
Z6hSEfU+ez1VaFs3tLHSMz7sRLX/3A0AKA6TKEH9UFh/6uRCCNYlyXsCgYEAyYXA
94+
NcHPZoWKBcKIAe4pLBDOZgkO/V5CBJ8R38TIizOJWjnzCuIyG60bq/7uVegGeWHr
95+
8Ajzz4rKSkmoiCXzT1s50/i7u5W9OUC9QaQYjR1FcoK543f77lZZ7RVhmHw9bACu
96+
iXDQQMUeTv2OJnjDghAwa2ML92vm3u76zCrEEhMCgYATqm4cfPwW88P2+DgiQxXH
97+
Rc7Fyk3nV+ZlgyKxT3uGAoHr9axgSw3XDU6+X0MZnAkWtsiDtaHuZX7i+w5fhvF2
98+
pja/Ht0W7BdqPgDdK82id+oacilYiJEnk5ctfelueOD18MIOJCGWDSEpUMn2ZzGO
99+
72yBJX5iyzbaow+hXxC+hwKBgEQ4fSs1oyqHxoPQqQ5OO63pOpYcNvDa+epqlzhz
100+
e5h0J+ldeMOUc3YfEiEVukVmuNpape6qeS8nQvgHG4CLqGSS826o45TLSjWZjvgr
101+
vwv2fs4XJyq0MZsrrGGwPUvLs1dem7d3c2iZ0nrXJ0oq07SyGlIgQ6rM4mlR6aE4
102+
UQv1AoGAPgI7RDJcqXMwG7CyIboLTyPRWsFfhN1nlALP1URK61kAkxgBusg45GEa
103+
k8hTB9lhcWDTbL/GVHn5JWxn8ytLPZiDR2RbJtE/Z1bagROANrFYjqJib8lyFhvt
104+
HYXONl5W77CPrYjOLD+Q9ZXjYYvtAxnqFNXicRMPti7Sre9SkRo=
105+
-----END RSA PRIVATE KEY-----
106+
EOF

features/bootstrap/FeatureContext.php

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
include_once(__DIR__ . '/../../php/class-ee.php');
44
include_once(__DIR__ . '/../../php/utils.php');
55

6+
define( 'EE_CONF_ROOT', '/opt/easyengine' );
7+
68
use Behat\Behat\Context\Context;
79
use Behat\Behat\Hook\Scope\AfterFeatureScope;
810

@@ -65,6 +67,14 @@ public function returnCodeShouldBe0()
6567
}
6668
}
6769

70+
/**
71+
* @Then After delay of :time seconds
72+
*/
73+
public function afterDelayOfSeconds( $time )
74+
{
75+
sleep( $time );
76+
}
77+
6878
/**
6979
* @Then /(STDOUT|STDERR) should return exactly/
7080
*/
@@ -167,6 +177,61 @@ public function requestOnShouldContainFollowingHeaders($site, TableNode $table)
167177
curl_setopt($ch, CURLOPT_HEADER, true);
168178
curl_setopt($ch, CURLOPT_NOBODY, true);
169179
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
180+
curl_setopt($ch, CURLOPT_VERBOSE, true);
181+
$headers = curl_exec($ch);
182+
183+
curl_close($ch);
184+
185+
$rows = $table->getHash();
186+
187+
foreach ($rows as $row) {
188+
if (strpos($headers, $row['header']) === false) {
189+
throw new Exception("Unable to find " . $row['header'] . "\nActual output is : " . $headers);
190+
}
191+
}
192+
}
193+
194+
/**
195+
* @Then Request on :host with header :header should contain following headers:
196+
*/
197+
public function requestOnWithHeaderShouldContainFollowingHeaders($host, $header, TableNode $table)
198+
{
199+
200+
$ch = curl_init();
201+
curl_setopt($ch, CURLOPT_URL, $host);
202+
curl_setopt($ch, CURLOPT_HEADER, true);
203+
curl_setopt($ch, CURLOPT_HTTPHEADER, [ $header ]);
204+
curl_setopt($ch, CURLOPT_NOBODY, true);
205+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
206+
curl_setopt($ch, CURLOPT_VERBOSE, true);
207+
$headers = curl_exec($ch);
208+
209+
curl_close($ch);
210+
211+
$rows = $table->getHash();
212+
213+
foreach ($rows as $row) {
214+
if (strpos($headers, $row['header']) === false) {
215+
throw new Exception("Unable to find " . $row['header'] . "\nActual output is : " . $headers);
216+
}
217+
}
218+
}
219+
220+
/**
221+
* @Then Request on :host with resolve option :resolve should contain following headers:
222+
*/
223+
public function requestOnWithResolveOptionShouldContainFollowingHeaders($host, $resolve, TableNode $table)
224+
{
225+
226+
$ch = curl_init();
227+
curl_setopt($ch, CURLOPT_URL, $host);
228+
curl_setopt($ch, CURLOPT_HEADER, true);
229+
curl_setopt($ch, CURLOPT_NOBODY, true);
230+
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
231+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
232+
curl_setopt($ch, CURLOPT_RESOLVE, [ $resolve ]);
233+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
234+
curl_setopt($ch, CURLOPT_VERBOSE, true);
170235
$headers = curl_exec($ch);
171236
curl_close($ch);
172237

@@ -184,7 +249,22 @@ public function requestOnShouldContainFollowingHeaders($site, TableNode $table)
184249
*/
185250
public static function cleanup(AfterFeatureScope $scope)
186251
{
187-
exec("sudo bin/ee site delete hello.test");
252+
$test_sites = [
253+
'hello.test',
254+
'example.test',
255+
'www.example1.test',
256+
'example2.test',
257+
'www.example3.test',
258+
];
259+
260+
$result = EE::launch( 'sudo bin/ee site list --format=text',false, true );
261+
$running_sites = explode( "\n", $result->stdout );
262+
$sites_to_delete = array_intersect( $test_sites, $running_sites );
263+
264+
foreach ( $sites_to_delete as $site ) {
265+
exec("sudo bin/ee site delete $site --yes" );
266+
}
267+
188268
if(file_exists('ee.phar')) {
189269
unlink('ee.phar');
190270
}

features/redirect.feature

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
Feature: Site Redirection
2+
3+
Scenario: no_www-no_ssl redirection works properly
4+
When I run 'sudo bin/ee site create example.test'
5+
Then Request on 'localhost' with header 'Host: www.example.test' should contain following headers:
6+
| header |
7+
| HTTP/1.1 301 Moved Permanently |
8+
| Location: http://example.test/ |
9+
10+
Scenario: www-no_ssl redirection works properly
11+
When I run 'sudo bin/ee site create www.example1.test'
12+
Then Request on 'localhost' with header 'Host: example1.test' should contain following headers:
13+
| header |
14+
| HTTP/1.1 301 Moved Permanently |
15+
| Location: http://www.example1.test/ |
16+
17+
Scenario: no_www-ssl redirection works properly
18+
When I run 'sudo bin/ee site create example2.test --le [email protected] --skip-status-check'
19+
Then Request on 'localhost' with header 'Host: www.example2.test' should contain following headers:
20+
| header |
21+
| HTTP/1.1 301 Moved Permanently |
22+
| Location: https://example2.test/ |
23+
And Request on 'https://www.example2.test' with resolve option 'www.example2.test:443:127.0.0.1' should contain following headers:
24+
| header |
25+
| HTTP/1.1 301 Moved Permanently |
26+
| Location: https://example2.test/ |
27+
28+
Scenario: www-ssl redirection works properly
29+
When I run 'sudo bin/ee site create www.example3.test --le [email protected] --skip-status-check'
30+
Then Request on 'localhost' with header 'Host: example3.test' should contain following headers:
31+
| header |
32+
| HTTP/1.1 301 Moved Permanently |
33+
| Location: https://www.example3.test/ |
34+
And Request on 'https://example3.test/' with resolve option 'example3.test:443:127.0.0.1' should contain following headers:
35+
| header |
36+
| HTTP/1.1 301 Moved Permanently |
37+
| Location: https://www.example3.test/ |

src/Site_Command.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,8 @@ private function configure_site() {
704704
$env_content = \EE\Utils\mustache_render( SITE_TEMPLATE_ROOT . '/config/.env.mustache', $env_data );
705705
$php_ini_content = \EE\Utils\mustache_render( SITE_TEMPLATE_ROOT . '/config/php-fpm/php.ini.mustache', [] );
706706

707+
$this->add_site_redirects();
708+
707709
try {
708710
if ( ! ( file_put_contents( $site_docker_yml, $docker_compose_content )
709711
&& file_put_contents( $site_conf_env, $env_content )
@@ -721,6 +723,63 @@ private function configure_site() {
721723
}
722724
}
723725

726+
/**
727+
* Adds www to non-www redirection to site
728+
*/
729+
private function add_site_redirects() {
730+
$confd_path = EE_CONF_ROOT . '/nginx/conf.d/';
731+
$config_file_path = $confd_path . $this->site_name . '-redirect.conf';
732+
$has_www = strpos( $this->site_name, 'www.' ) === 0;
733+
$content = '';
734+
735+
if( $has_www ) {
736+
$site_name_without_www = ltrim( $this->site_name, '.www' );
737+
// ee site create www.example.com --le
738+
if( $this->le ) {
739+
$content = "
740+
server {
741+
listen 80;
742+
listen 443;
743+
server_name $site_name_without_www;
744+
return 301 https://$this->site_name\$request_uri;
745+
}";
746+
}
747+
// ee site create www.example.com
748+
else {
749+
$content = "
750+
server {
751+
listen 80;
752+
server_name $site_name_without_www;
753+
return 301 http://$this->site_name\$request_uri;
754+
}";
755+
}
756+
}
757+
else {
758+
$site_name_with_www = 'www.' . $this->site_name;
759+
// ee site create example.com --le
760+
if( $this->le ) {
761+
762+
$content = "
763+
server {
764+
listen 80;
765+
listen 443;
766+
server_name $site_name_with_www;
767+
return 301 https://$this->site_name\$request_uri;
768+
}";
769+
}
770+
// ee site create example.com
771+
else {
772+
$content = "
773+
server {
774+
listen 80;
775+
server_name $site_name_with_www;
776+
return 301 http://$this->site_name\$request_uri;
777+
}";
778+
}
779+
}
780+
file_put_contents( $config_file_path, ltrim( $content, PHP_EOL ) );
781+
}
782+
724783
/**
725784
* Function to generate default.conf from mustache templates.
726785
*

0 commit comments

Comments
 (0)