Skip to content
This repository was archived by the owner on May 14, 2020. It is now read-only.

Commit 25ad2ee

Browse files
committed
Few improvements, see changelog.
1 parent 88ed8dc commit 25ad2ee

24 files changed

+148
-52
lines changed

CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
## [2.0.1] - 2020-01-27
2+
3+
Prerender option now more configurable and supports many of sets
4+
cloud-services or local instances.
5+
6+
### Added
7+
8+
- Option `server.prerender.resolver`. This is a nginx "resolver" option to force DNS resolution and prevent caching of IPs.
9+
- Option `server.prerender.headers` (array of headers). This is an authorization headers (or others), format: key - $headerName, value - $headerValue.
10+
11+
### Changed
12+
13+
- Option `server.prerender.url` accepts url with schema and will be passed to `proxy_pass` option as is.
14+
15+
### Removed
16+
17+
- Option `server.prerender.token`. Use `server.prerender.headers` option.
18+
19+
20+
## [2.0.0] - 2020-01-09
21+
22+
Released new version of SPA-webserver.
23+
Full backward compatibility with previous 1.0.0 version except
24+
compression options (it not configurable more). From this version
25+
changelog will be started.
26+

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Static server
44
[![CircleCI](https://circleci.com/gh/microparts/static-server-php/tree/master.svg?style=svg)](https://circleci.com/gh/microparts/static-server-php/tree/master)
55
[![codecov](https://codecov.io/gh/microparts/static-server-php/branch/master/graph/badge.svg)](https://codecov.io/gh/microparts/static-server-php)
66

7-
Special static server with support corporate standard of configuration and more.
7+
Specific static server with support corporate standard of configuration and more..
88
This server is a simple wrapper for nginx or an any web server.
99

1010
Server created for javascript SPA apps like: Vue, React, Angular, etc.
@@ -15,7 +15,7 @@ Server created for javascript SPA apps like: Vue, React, Angular, etc.
1515
* Secure headers by default.
1616
* If backend app will be hacked, the hacker may write a letter to us, because email address injected to head section of index (console message) :)
1717
* Corporate config standard supported by default and injected too.
18-
* Brotli-compression. Compression based on `Accept-Encoding` header. [More](#Compression).
18+
* Brotli-compression (Gzip used as fallback for outdated browsers). Enabled by default. [More](#Compression).
1919
* Deny all `robots.txt` by default.
2020
* Hot reload
2121

@@ -107,6 +107,8 @@ server:
107107
prerender:
108108
enabled: false
109109
url: null
110+
resolver: "8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1"
111+
headers: []
110112
service_worker:
111113
enabled: false
112114
log_info: '%%cSTAGE=%s SHA1=%s; %%cSecurity bugs: [email protected], Job/partnership: [email protected]'

configuration/defaults/___server.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ defaults:
1818
config: ~/.server/generated_nginx.conf
1919
prerender:
2020
enabled: false
21-
url: null
21+
url: null # Proxy pass URL for bots, with schema.
22+
resolver: "8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1" # nginx "resolver" option to force DNS resolution and prevent caching of IPs
23+
headers: [] # Authorization headers (or others), format: key - $headerName, value - $headerValue
2224
log_info: "%%cSTAGE=%s SHA1=%s; %%cSecurity bugs: [email protected], Job/partnership: [email protected]"
2325
logger:
2426
enabled: true

configuration/defaults/___server_compress.yaml

Lines changed: 0 additions & 27 deletions
This file was deleted.

phpstan.neon

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
parameters:
22
excludes_analyse:
33
- src/Handler/templates/*
4-
ignoreErrors:
5-
- '#Call to an undefined method RecursiveDirectoryIterator\|RecursiveIteratorIterator\:\:getSubPathname\(\)#'
4+
# ignoreErrors:
5+
# - '#Call to an undefined method RecursiveDirectoryIterator\|RecursiveIteratorIterator\:\:getSubPathname\(\)#'

src/Handler/AbstractHandler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ protected function touchFile(string $filename): void
6969
}
7070

7171
/**
72-
* @param array $paths
72+
* @param array<string> $paths
7373
*/
7474
protected function makePathForFiles(array $paths): void
7575
{

src/Handler/NginxHandler.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ public function generateConfig(HeaderInterface $header): void
7979
'serverHost' => $this->configuration->get('server.host'),
8080
'prerenderEnabled' => $this->configuration->get('server.prerender.enabled'),
8181
'prerenderUrl' => $this->getHostWithoutTrailingSlash('server.prerender.url'),
82-
'prerenderToken' => $this->configuration->get('server.prerender.token'),
82+
'prerenderHeaders' => $this->configuration->get('server.prerender.headers', []),
83+
'prerenderResolver' => $this->configuration->get('server.prerender.resolver', false),
8384
'prerenderHost' => $this->getHostWithoutTrailingSlash('server.prerender.host'),
8485
'headers' => $header->convert($this->configuration),
8586
'connProcMethod' => $this->getConnectionProcessingMethod(),
@@ -172,18 +173,18 @@ private function checkIfPrerenderUrlIsAvailable(): void
172173
return;
173174
}
174175

175-
$scheme = parse_url($this->configuration->get('server.prerender.url', ''), PHP_URL_SCHEME);
176-
177-
if ($scheme) {
178-
throw new InvalidArgumentException("Prerender url has a scheme: [$scheme], please remove it.");
179-
}
180-
181176
$url = $this->configuration->get('server.prerender.url', false);
182177

183178
if (!$url) {
184179
throw new InvalidArgumentException('Prerender URL not set. Check server.prerender.url config key.');
185180
}
186181

182+
$url = (string) parse_url($url, PHP_URL_HOST);
183+
184+
if (strlen($url) < 1) {
185+
throw new InvalidArgumentException('Prerender URL is invalid. Check server.prerender.url config key.');
186+
}
187+
187188
$this->logger->info('Ping prerender url...');
188189

189190
$ping = new Ping($url);

src/Handler/templates/nginx_default.conf.php

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@
131131
open_file_cache_errors on;
132132

133133
# to boost I/O on HDD we can disable access logs
134-
access_log on;
134+
access_log off;
135135

136136
# copies data between one FD and other from within the kernel
137137
# faster than read() + write()
@@ -254,38 +254,39 @@
254254
}
255255

256256
location @prerender {
257-
<?php if ($prerenderEnabled && $prerenderToken):?>
258-
proxy_set_header X-Prerender-Token "<?=$prerenderToken?>";
259-
<?php endif;?>
257+
<?php foreach($prerenderHeaders as $name => $value):?>
258+
add_header "<?=$name?>" "<?=addslashes($value)?>";
259+
<?php endforeach;?>
260260

261261
proxy_read_timeout 120s;
262262
proxy_intercept_errors on;
263263
proxy_buffering on;
264264
proxy_cache STATIC;
265-
proxy_cache_valid 200 12h;
265+
proxy_cache_valid 200 404 24h;
266266
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
267267

268268
set $prerender 0;
269-
if ($http_user_agent ~* "googlebot|bingbot|yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest\/0\.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp|telegram|bot") {
269+
if ($http_user_agent ~* "bot|whatsapp|telegram|google|bing|yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedin|embedly|quora link preview|showyoubot|outbrain|pinterest\/0\.|pinterestbot|slackbot|vkShare|W3C_Validator") {
270270
set $prerender 1;
271271
}
272272

273273
if ($args ~ "_escaped_fragment_") {
274274
set $prerender 1;
275275
}
276276

277-
if ($http_user_agent ~ "Prerender") {
277+
if ($http_user_agent ~* "prerender") {
278278
set $prerender 0;
279279
}
280280

281-
# resolve using Google's DNS/Cloudflare server to force DNS resolution and prevent caching of IPs
282-
resolver 8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1;
281+
<?php if ($prerenderResolver):?>
282+
# resolve using Google's DNS/Cloudflare server to force DNS resolution and prevent caching of IPs
283+
resolver <?=$prerenderResolver?>;
284+
<?php endif;?>
283285

284286
if ($prerender = 1) {
285287
#setting prerender as a variable forces DNS resolution since nginx caches IPs and doesnt play well with load balancing
286-
set $prerender "<?=$prerenderUrl?>";
287-
rewrite .* /<?=$prerenderHost?>$request_uri? break;
288-
proxy_pass https://$prerender;
288+
rewrite .* /<?=$prerenderHost?>$request_uri?$query_string break;
289+
proxy_pass "<?=$prerenderUrl?>";
289290
}
290291

291292
if ($prerender = 0) {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace StaticServer\Tests\Modifier;
4+
5+
use Microparts\Configuration\Configuration;
6+
use Psr\Log\NullLogger;
7+
use StaticServer\Modifier\Iterator\RecursiveIterator;
8+
use StaticServer\Modifier\Modify;
9+
use StaticServer\Modifier\ModifyInterface;
10+
use StaticServer\Modifier\NullModify;
11+
use StaticServer\Tests\TestCase;
12+
13+
class ModifyTest extends TestCase
14+
{
15+
public function testAddFilesToModify()
16+
{
17+
$conf = new Configuration(__DIR__ . '/../configuration', 'nested');
18+
$conf->load();
19+
20+
$m = new Modify();
21+
$m->setLogger(new NullLogger());
22+
$m->setConfiguration($conf);
23+
$m->addModifier(new NullModify());
24+
$m->addTemplate(__FILE__, '/foobar');
25+
26+
$it = new RecursiveIterator();
27+
$it->setLogger(new NullLogger());
28+
$it->setConfiguration($conf);
29+
/** @var \StaticServer\Modifier\Iterator\Transfer[] $array */
30+
$m->modifyAndSaveToDisk($it->iterate());
31+
32+
$path = realpath($conf->get('server.modify.root'));
33+
$this->assertFileExists($path . '/nested/bla-bla.txt');
34+
$this->assertFileExists($path . '/foobar');
35+
$this->assertEquals(file_get_contents(__FILE__), file_get_contents($path . '/foobar'));
36+
}
37+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-

0 commit comments

Comments
 (0)