Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π° nginx, ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π° Π½Π° Π΅Π΄Π½ΠΎ Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅

ΠŸΠΎΠ·Π΄Ρ€Π°Π², Π΄Ρ€ΡƒΠ³Π°Ρ€ΠΈ. ΠŸΡ€Π΅ΠΊΡ€Π°ΡΠ½ΠΎ Π½Π° ΠΌΠΎΠΈΡ‚Π΅ Π±ΠΎΡ€Π±Π΅Π½ΠΈ сСрвСри nginx Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΎΠ΄ 2006 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ Π²ΠΎ Ρ‚Π΅ΠΊΠΎΡ‚ Π½Π° Π³ΠΎΠ΄ΠΈΠ½ΠΈΡ‚Π΅ Π½Π° Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡ˜Π° ΠΈΠΌΠ°ΠΌ Π°ΠΊΡƒΠΌΡƒΠ»ΠΈΡ€Π°Π½ΠΎ ΠΌΠ½ΠΎΠ³Ρƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ шаблони. ΠœΠ½ΠΎΠ³Ρƒ Π³ΠΎ ΠΏΠΎΡ„Π°Π»ΠΈΠ² nginx ΠΈ Π½Π΅ΠΊΠ°ΠΊΠΎ испадна Π΄Π΅ΠΊΠ° Π΄ΡƒΡ€ΠΈ ΠΈ ΠΏΠΎΡ‡Π½Π°Π² nginx hub Π½Π° Ρ…Π°Π±ΠΎΡ‚, ΠΏΠΎΠΊΠ°ΠΆΠΈ сС ΠΌ/
ΠŸΡ€ΠΈΡ˜Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ ΠΌΠ΅ замолија Π΄Π° ΠΈΠΌ поставам Ρ€Π°Π·Π²ΠΎΡ˜Π½Π° Ρ„Π°Ρ€ΠΌΠ° ΠΈ намСсто Π΄Π° ΠΈΠΌ Π³ΠΈ Π²Π»Π΅Ρ‡Π°ΠΌ ΠΌΠΎΠΈΡ‚Π΅ спСцифични шаблони, сС сСтив Π½Π° Π΅Π΄Π΅Π½ интСрСсСн ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ nginxconfig.io, кој Π³ΠΈ расфрла ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΠ»ΠΈΡ†ΠΈΡ‚Π΅ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΡƒΠ²Π° сè Π·Π° ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΡšΠ΅, ΠΈΡ‚Π½. МислСв, Π·ΠΎΡˆΡ‚ΠΎ Π΄Π° Π½Π΅? Π‘Π΅ΠΏΠ°ΠΊ, ΠΌΠ΅ Π½Π°Π»ΡƒΡ‚ΠΈ Ρ„Π°ΠΊΡ‚ΠΎΡ‚ ΡˆΡ‚ΠΎ nginxconfig ΠΌΠΈ Π½ΡƒΠ΄ΠΈ Π΄Π° ја ΠΏΡ€Π΅Π·Π΅ΠΌΠ°ΠΌ zip Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π° Π²ΠΎ прСлистувачот, Π±Π΅Π· Π΄Π° ΠΌΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ја ΠΏΠΎΠ΄ΠΈΠ³Π½Π°ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° сСрвСрот ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ wget/fetch/curl. Какви глупости, Π·ΠΎΡˆΡ‚ΠΎ ΠΌΠΈ Ρ‚Ρ€Π΅Π±Π° Π²ΠΎ прСлистувачот, ΠΌΠΈ Ρ‚Ρ€Π΅Π±Π° Π½Π° сСрвСрот ΠΎΠ΄ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°. Π›ΡƒΡ‚, ΠΎΡ‚ΠΈΠ΄ΠΎΠ² Π²ΠΎ github Π·Π° Π΄Π° Π³ΠΈ Π²ΠΈΠ΄Π°ΠΌ храброста Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚, ΡˆΡ‚ΠΎ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Π²ΠΈΠ»ΡƒΡˆΠΊΠ° ΠΈ, ΠΊΠ°ΠΊΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅. Π—Π° ΡˆΡ‚ΠΎ Π½Π΅ Π±ΠΈ ΠΏΠΈΡˆΡƒΠ²Π°Π» Π΄Π° Π½Π΅ Π΅ интСрСсно πŸ˜‰

Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π° nginx, ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π° Π½Π° Π΅Π΄Π½ΠΎ Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅

Π‘Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°, ΠΏΡ€Π΅Π΄ Π΄Π° ΠΊΠΎΠΏΠ°ΠΌ Π²ΠΎ ΠΈΠ·Π²ΠΎΡ€ΠΈΡ‚Π΅, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Π² ΠΊΠ°Π΄Π΅ Chrome ја Π²Π»Π΅Ρ‡Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π°Ρ‚Π° Π·ΠΈΠΏ Π°Ρ€Ρ…ΠΈΠ²Π° со ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π° Ρ‚Π°ΠΌΡƒ ΠΌΠ΅ Ρ‡Π΅ΠΊΠ°ΡˆΠ΅ адрСсата ΡˆΡ‚ΠΎ ΠΏΠΎΡ‡Π½ΡƒΠ²Π° со β€žblob:β€œ, ΠΎΠΏΠ°. Π’Π΅ΡœΠ΅ стана јасно Π΄Π΅ΠΊΠ° услугата Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Π½ΠΈΡˆΡ‚ΠΎ Π½Π° ΠΏΠ°Ρ‚ΠΎΡ‚, Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚, сСто Ρ‚ΠΎΠ° Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ js. Навистина, Π·ΠΈΠΏ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π° Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π° ΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚, прСлистувачот ΠΈ самиот javascript. ОниС. ΡƒΠ±Π°Π²ΠΈΠ½Π°Ρ‚Π° Π΅ Π²ΠΎ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ nginxconfig.io ΠΌΠΎΠΆΠ΅ Сдноставно Π΄Π° сС Π·Π°Ρ‡ΡƒΠ²Π° ΠΊΠ°ΠΊΠΎ html страница, поставСна Π½Π° Π½Π΅ΠΊΠΎΠΈ narod.ru ΠΈ ќС Ρ€Π°Π±ΠΎΡ‚ΠΈ) Ова Π΅ ΠΌΠ½ΠΎΠ³Ρƒ смСшно ΠΈ интСрСсно Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, сСпак, уТасно Π΅ Π½Π΅Π·Π³ΠΎΠ΄Π½ΠΎ Π·Π° ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ сСрвСри, Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚, Ρ‚ΠΎΠΊΠΌΡƒ Π·Π° ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π΅ создадСн овој ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ΠŸΡ€Π΅Π·Π΅ΠΌΠ΅Ρ‚Π΅ ја Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π°Ρ‚Π° Π°Ρ€Ρ…ΠΈΠ²Π° со прСлистувач, Π° ΠΏΠΎΡ‚ΠΎΠ° ΠΏΡ€Π΅Ρ„Ρ€Π»Π΅Ρ‚Π΅ ја Π½Π° сСрвСрот ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ nc... Π²ΠΎ 2019 Π³ΠΎΠ΄ΠΈΠ½Π°? Π‘ΠΈ поставив Π·Π°Π΄Π°Ρ‡Π° Π΄Π° најдам Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ја ΠΏΡ€Π΅Π·Π΅ΠΌΠ°ΠΌ Π΄ΠΎΠ±ΠΈΠ΅Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° сСрвСрот.
ΠžΡ‚ΠΊΠ°ΠΊΠΎ Π³ΠΎ Π·Π°Π²Ρ€ΡˆΠΈΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚, ΠΏΠΎΡ‡Π½Π°Π² Π΄Π° размислувам ΠΊΠΎΠΈ сС ΠΌΠΎΠΈΡ‚Π΅ ΠΎΠΏΡ†ΠΈΠΈ. Π—Π°Π΄Π°Ρ‡Π°Ρ‚Π° бСшС ΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π½Π° ΠΎΠ΄ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Π½Π΅ сакав Π΄Π° отстапам ΠΎΠ΄ условот ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π΄Π° останС чист Ρ„Ρ€ΠΎΠ½Ρ‚-Π΅Π½Π΄, Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠΎΠ² Π±Π΅ΠΊ-Π΅Π½Π΄. Π‘Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°, Π½Π°Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄Π° сС ΠΏΠΎΠ²Π»Π΅Ρ‡Π°Ρ‚ nodejs ΠΈ Π΄Π° сС ΠΏΡ€ΠΈΠ½ΡƒΠ΄Π°Ρ‚ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Π°Ρ€Ρ…ΠΈΠ²Π° со ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΈ врски.
Π’ΡΡƒΡˆΠ½ΠΎΡΡ‚, нСмашС ΠΌΠ½ΠΎΠ³Ρƒ ΠΎΠΏΡ†ΠΈΠΈ. ΠŸΠΎΡ‚ΠΎΡ‡Π½ΠΎ, само Π΅Π΄Π΅Π½ ΠΌΠΈ ΠΏΠ°Π΄Π½Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚. Π’Ρ€Π΅Π±Π° Π΄Π° Π³ΠΈ поставимС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅ ΠΈ Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ врска ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ја ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ Π½Π° сСрвСрската ΠΊΠΎΠ½Π·ΠΎΠ»Π° Π·Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Π·ΠΈΠΏ Π°Ρ€Ρ…ΠΈΠ²Π°.
НСколку тСкстуални Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π²ΠΎ Π΄ΠΎΠ±ΠΈΠ΅Π½Π°Ρ‚Π° Π·ΠΈΠΏ Π°Ρ€Ρ…ΠΈΠ²Π° Ρ‚Π΅ΠΆΠ΅Π° ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ ΠΌΠ°Π»ΠΊΡƒ, Π±ΡƒΠΊΠ²Π°Π»Π½ΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΊΠΈΠ»ΠΎΠ±Π°Ρ˜Ρ‚ΠΈ. ΠžΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ бСшС Π΄Π° сС Π΄ΠΎΠ±ΠΈΠ΅ Π½ΠΈΠ·Π°Ρ‚Π° base64 ΠΎΠ΄ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π°Ρ‚Π° zip Π°Ρ€Ρ…ΠΈΠ²Π° ΠΈ Π΄Π° сС Ρ„Ρ€Π»ΠΈ Π²ΠΎ Π±Π°Ρ„Π΅Ρ€ΠΎΡ‚, Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π° сСрвСрот со ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π²ΠΎ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°

echo 'base64string' | base64 --decode > config.zip

Π±ΠΈ ΠΌΠΎΠΆΠ΅Π»Π΅ Π΄Π° ја ΠΊΡ€Π΅ΠΈΡ€Π°ΠΌΠ΅ истата Π·ΠΈΠΏ-Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°.

nginxconfig.io бСшС напишано Π²ΠΎ AngularJS, Π½Π΅ ΠΌΠΎΠΆΠ°ΠΌ Π½ΠΈ Π΄Π° замислам ΠΊΠΎΠ»ΠΊΡƒ ΠΊΠΈΠ»ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΊΠΎΠ΄ Π±ΠΈ Π±ΠΈΠ»Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ Π΄ΠΎΠΊΠΎΠ»ΠΊΡƒ Π°Π²Ρ‚ΠΎΡ€ΠΎΡ‚ Π½Π΅ ΠΈΠ·Π±Ρ€Π°Π» Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Π° js Ρ€Π°ΠΌΠΊΠ°. Но, ΡΠΎΠ²Ρ€ΡˆΠ΅Π½ΠΎ ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° замислам ΠΊΠΎΠ»ΠΊΡƒ поСдноставно ΠΈ ΠΏΠΎΡƒΠ±Π°Π²ΠΎ сСто ΠΎΠ²Π° Π±ΠΈ ΠΌΠΎΠΆΠ΅Π»ΠΎ Π΄Π° сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° Π²ΠΎ VueJS, ΠΈΠ°ΠΊΠΎ ΠΎΠ²Π° Π΅ сосСма Π΄Ρ€ΡƒΠ³Π° Ρ‚Π΅ΠΌΠ°.
Π’ΠΎ рСсурситС Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° zip Π°Ρ€Ρ…ΠΈΠ²Π°:

$scope.downloadZip = function() {
	var zip = new JSZip();

	var sourceCodes = $window.document.querySelectorAll('main .file .code.source');

	for (var i = 0; i < sourceCodes.length; i++) {
		var sourceCode = sourceCodes[i];

		var name	= sourceCode.dataset.filename;
		var content	= sourceCode.children[0].children[0].innerText;

		if (!$scope.isSymlink() && name.match(/^sites-available//)) {
			name = name.replace(/^sites-available//, 'sites-enabled/');
		}

		zip.file(name, content);

		if (name.match(/^sites-available//)) {
			zip.file(name.replace(/^sites-available//, 'sites-enabled/'), '../' + name, {
				unixPermissions: parseInt('120755', 8),
			});
		}
	}

	zip.generateAsync({
		type: 'blob',
		platform: 'UNIX',
	}).then(function(content) {
		saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
	});

	gtag('event', $scope.getDomains().join(','), {
		event_category: 'download_zip',
	});
};

сè Π΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Сдноставно, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° jszip Π‘Π΅ ΠΊΡ€Π΅ΠΈΡ€Π° zip ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ сС поставСни конфигурацискитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. По ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° zip Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π°, js ја доставува Π΄ΠΎ прСлистувачот ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° FileSaver.js:

saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');

ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ содрТината Π΅ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΠΎΡ‚ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ ΠΎΠ΄ Ρ†ΠΈΠΏ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚Π°.

Ок, сè ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π°ΡˆΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²Π°ΠΌ Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π°ΠΌ ΡƒΡˆΡ‚Π΅ Π΅Π΄Π½ΠΎ ΠΊΠΎΠΏΡ‡Π΅ Π΄ΠΎ Π½Π΅Π³ΠΎ ΠΈ ΠΊΠΎΠ³Π° ќС ΠΊΠ»ΠΈΠΊΠ½Π°ΠΌ Π½Π° Π½Π΅Π³ΠΎ, Π½Π΅ΠΌΠ° Π΄Π° ја Π·Π°Ρ‡ΡƒΠ²Π°ΠΌ Π΄ΠΎΠ±ΠΈΠ΅Π½Π°Ρ‚Π° ΠΏΠΎΡˆΡ‚Π΅Π½ΡΠΊΠ° Π°Ρ€Ρ…ΠΈΠ²Π° Π²ΠΎ прСлистувачот, Ρ‚ΡƒΠΊΡƒ Π΄Π° Π³ΠΎ Π·Π΅ΠΌΠ°ΠΌ ΠΊΠΎΠ΄ΠΎΡ‚ base64 ΠΎΠ΄ Π½Π΅Π³ΠΎ. ΠžΡ‚ΠΊΠ°ΠΊΠΎ ΠΌΠ°Π»ΠΊΡƒ сС Π·Π°Ρ„Ρ€ΠΊΠ°Π²Π°Π², Π΄ΠΎΠ±ΠΈΠ² 2 ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ, намСсто само Π΅Π΄Π½ΠΎ ΠΏΡ€Π΅Π·Π΅ΠΌΠ°ΡšΠ΅ Zip:

$scope.downloadZip = function() {
	generateZip(function (content) {
		saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
	});

	gtag('event', $scope.getDomains().join(','), {
		event_category: 'download_zip',
	});
};
$scope.downloadBase64 = function() {
	generateZip(function (content) {
		var reader = new FileReader();
		reader.readAsDataURL(content);
		reader.onloadend = function() {
			var base64 = reader.result.replace(/^data:.+;base64,/, '');
			// Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ base64 ΠΊΠ°ΠΊ Ρ€Π°Π· Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠ½Π΅ zip Π°Ρ€Ρ…ΠΈΠ² Π² Π²ΠΈΠ΄Π΅ base64 строки
		}
	});

	gtag('event', $scope.getDomains().join(','), {
		event_category: 'download_base64',
	});
};

Како ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π²Ρ‚Π΅, ја ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈΠ² Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° самата Π·ΠΈΠΏ Π°Ρ€Ρ…ΠΈΠ²Π° Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π΅Π½ generateZip ΠΈΡ‚Π½. Ова Π΅ AngularJS, Π° самиот Π°Π²Ρ‚ΠΎΡ€ сС Π΄Ρ€ΠΆΠΈ Π΄ΠΎ ΠΏΠΎΠ²ΠΈΡ†ΠΈΡ‚Π΅ ΠΈ Π½Π΅ Π³ΠΎ спровСдС ΠΏΡ€Π΅ΠΊΡƒ Π²Π΅Ρ‚ΡƒΠ²Π°ΡšΠ°. downloadZip сСпак Π½Π°ΠΏΡ€Π°Π²ΠΈ saveAs ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π»Π΅Π·, Π΄ΠΎΠ΄Π΅ΠΊΠ° downloadBase64 Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π΅ΡˆΡ‚ΠΎ ΠΌΠ°Π»ΠΊΡƒ ΠΏΠΎΠΈΠ½Π°ΠΊΡƒ. НиС ΠΊΡ€Π΅ΠΈΡ€Π°ΠΌΠ΅ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ FileReader кој Π½ΠΈ дојдС Π²ΠΎ html5 ΠΈ вСќС Π΅ доста достапСн Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°. Која, Π²ΠΎ Π΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½ΠΈΠ·Π° base64 ΠΎΠ΄ blob, ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ ΠΊΠ°ΠΆΠ°Π½ΠΎ, ΠΏΡ€Π°Π²ΠΈ Π½ΠΈΠ·Π° DataURL, Π½ΠΎ Ρ‚ΠΎΠ° Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΡƒ Π²Π°ΠΆΠ½ΠΎ Π·Π° нас, бидСјќи DataURL Π³ΠΎ содрТи Ρ‚ΠΎΠΊΠΌΡƒ ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°. Π‘ΠΈΠ½Π³ΠΎ, ΠΌΠ΅ Ρ‡Π΅ΠΊΠ°ΡˆΠ΅ ΠΌΠ°Π»Π° Ρ„ΠΈΠ½Ρ‚Π° ΠΊΠΎΠ³Π° сС ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° Π³ΠΎ ставам сСто ΠΎΠ²Π° Π²ΠΎ Ρ‚Π°ΠΌΠΏΠΎΠ½. Авторот ја искористи Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π²ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Ρ‚Π°Π±Π»Π°Ρ‚Π° со исСчоци, ΡˆΡ‚ΠΎ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ со Ρ‚Π°Π±Π»Π°Ρ‚Π° со исСчоци Π±Π΅Π· Π±Π»ΠΈΡ† ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ, Π²Ρ€Π· основа Π½Π° ΠΈΠ·Π±Ρ€Π°Π½ΠΈΠΎΡ‚ тСкст. ΠŸΡ€Π²ΠΈΡ‡Π½ΠΎ, Ρ€Π΅ΡˆΠΈΠ² Π΄Π° Π³ΠΎ ставам ΠΌΠΎΡ˜ΠΎΡ‚ base64 Π²ΠΎ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ со display:none;, Π½ΠΎ Π²ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π΅ ΠΌΠΎΠΆΠ΅Π² Π΄Π° Π³ΠΎ ставам Π½Π° Ρ‚Π°Π±Π»Π°Ρ‚Π° со исСчоци бидСјќи Π½Π΅ сС случува Ρ€Π°Π·Π΄Π΅Π»ΡƒΠ²Π°ΡšΠ΅. Π—Π°Ρ‚ΠΎΠ°, намСсто ΠΏΡ€ΠΈΠΊΠ°Π·: Π½Π΅ΠΌΠ°; јас Π½Π°ΠΏΡ€Π°Π²ΠΈΠ²

position: absolute;
z-index: -1;
opacity: 0;

ΡˆΡ‚ΠΎ ΠΌΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ ΠΈ Π΄Π° Π³ΠΎ ΡΠΎΠΊΡ€ΠΈΡ˜Π°ΠΌ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΡ‚ ΠΎΠ΄ ΠΏΠΎΠ³Π»Π΅Π΄ ΠΈ Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚ Π΄Π° Π³ΠΎ оставам Π½Π° страницата. Voila, Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° бСшС Π·Π°Π²Ρ€ΡˆΠ΅Π½Π°, ΠΊΠΎΠ³Π° ΠΊΠ»ΠΈΠΊΠ½Π°Π² Π½Π° ΠΌΠΎΠ΅Ρ‚ΠΎ ΠΊΠΎΠΏΡ‡Π΅, Π²ΠΎ Π±Π°Ρ„Π΅Ρ€ΠΎΡ‚ бСшС ставСна Π²Π°ΠΊΠ²Π° линија:

echo 'base64string' | base64 --decode > config.zip

ΡˆΡ‚ΠΎ Сдноставно Π³ΠΎ Π·Π°Π»Π΅ΠΏΠΈΠ² Π²ΠΎ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° Π½Π° сСрвСрот ΠΈ вСднаш Π΄ΠΎΠ±ΠΈΠ² Π·ΠΈΠΏ Π°Ρ€Ρ…ΠΈΠ²Π° со ситС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.
И, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, испратив Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ Π΄ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΎΡ‚, бидСјќи ... ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π΅ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΈ ΠΆΠΈΠ², Π±ΠΈ сакал Π΄Π° Π²ΠΈΠ΄Π°ΠΌ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ° ΠΎΠ΄ Π°Π²Ρ‚ΠΎΡ€ΠΎΡ‚ ΠΈ Π΄Π° ΠΈΠΌΠ°ΠΌ своС ΠΊΠΎΠΏΡ‡Π΅) Π—Π° заинтСрСсиранитС, Π΅Π²Π΅ Π³ΠΎ ΠΌΠΎΡ˜Π°Ρ‚Π° Π²ΠΈΠ»ΡƒΡˆΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ ΠΈ самиот Ρ‚ΠΎΡ˜ Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ ΠΊΠΎΡ€Π΅Π³ΠΈΡ€Π°Π²/Π΄ΠΎΠ΄Π°Π΄ΠΎΠ².
Π‘Ρ€Π΅ΡœΠ΅Π½ Ρ€Π°Π·Π²ΠΎΡ˜ Π½Π° ситС)

Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π° nginx, ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π° Π½Π° Π΅Π΄Π½ΠΎ Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€