Pull to refresh

Принцип KISS и директивы mod_rewrite

Reading time3 min
Views986
Пребывая в перманентных нелёгких раздумьях относительно web-технологий и своей к ним причастности, решил поделиться одной простой мыслью.

Было: Принцип KISS в настоящее время используется плохо, и это — плохо!

UPD 1: Афтыр пытается изобрести велосипед, поможем ему в этом? :)
UPD 2: Автору уже не помочь… :)

Было: Такой нелепый вывод был сделал на основе анализа настроек .htaccess для нескольких ультра-популярных систем.

UPD 3: Автор приносит извинения всем почитателям таких настроек, но до сих пор ещё пытается понять «что проще», автор не отрицает, что он «ещё учится»… :)



Чем именно? ::
За прошедшие пару месяцев я вынужденно ознакомился с «коробочными» настройками mod_rewrite в .htaccess файлах следующих систем:

  • 1C-Bitrix
  • Amiro
  • Drupal
  • Joomla
  • Wordpress
  • TYPO3
  • Cogear


Только не подумайте, что они мне не нравятся, как раз наоборот! Они хороши, все, по своему хороши для «своих» задач! И, да, я их все «смотрел»/«использовал» так, или иначе!

Принцип, по которому устроены настройки соответствует следующей логике:

Если нет файла, то перейти к движку.

А именно, в общих чертах примерно так:

	<IfModule mod_rewrite.c>
		RewriteCond %{REQUEST_FILENAME} !-f
		RewriteCond %{REQUEST_FILENAME} !-d
		RewriteRule ^ <u>index.php</u> [L]
	</IfModule>


Почему этот принцип используется настолько повсеместно – ответить не смог.

Видимо когда-то давным давно кто-то решил, что так будет лучше всего.
С тех пор никто особенно не задумывается, работает ведь, зачем менять?
Видимо, это действительно удобно, но…

Что нам даёт использование этого принципа:
  1. Движок анализирует URL, ищет для него запись в БД.
  2. Если записи нет, выдается 404.
  3. Если доступ текущему пользователю «запрещён» – 403.
  4. В общем случае мы лишены возможности «вывести» стандартную 404 ошибку сервера.
  5. Порой, для тех страниц, которые «есть» мы вынуждены в коде писать вставки для «подтягивания» движка и шаблонизатора и т.п. Хотя, вообще, конечно, можно от этого избавиться, дописав их в движок, если их там нет.


Кстати, в AmiroСMS и ряде других, подозреваю, вообще используется «архаика» на основе обработки 404 ошибки, это – «ze best»! Хотя система (не сочтите за рекламу) в целом — не плохая (ну, должен же я сказать что-то положительное, раз уже сказал что-то отрицательное).

И, вот, собственно, вопрос – что делать, как быть?

Для самописных (с нуля) сайтиков-визиток с десятком страниц я теперь поступаю вот так:
	<IfModule mod_rewrite.c>

		RewriteEngine On

		RewriteCond %{REQUEST_FILENAME} -s
		RewriteCond %{REQUEST_FILENAME} !-l
		RewriteCond %{REQUEST_FILENAME} !-d
		RewriteRule ^(.*)$ ../index.php?fn=%{REQUEST_FILENAME} [NS,NC,L]

	</IfModule>


Что это мне дает:

  1. «Статика» начинает обрабатываться только в том случае, если она есть.
  2. Если статики нет, значит так должно быть, отдаем 404 «из умолчания».
  3. К статике не нужно «привязывать» шаблон, он в самом движке, сразу.


Что представляет собой моя «статика»?

Текстовые файлы, банальные текстовые файлы…
Первая строчка это TITLE.
Вторая строчка это HEAD INCLUDE: всё, что мне нужно вставить до конца head.
Всё, что ниже третьей строчки — тельце странички…

Шаблон обычный, обычный такой шаблон, подключается в движок после того, как я «выберу» из статики три эти «переменные». Я могу сделать сколько угодно переменных, могу разделить их «спецпоследовательностью-спецсимволов», чтобы «чОтко» всё было.

Быстро ли работает?
Я тестов не делал, но, ИМХО – не медленнее.

А что с данными БД?

Так, а кто мешает сделать страничку под каждый «контроллер», или встроить «контроллеры» в тельце странички и обрабатывать «по параметрам».

Безопасность?

В PHP я – неофит, встроил такую проверку в начало «движка», но, полагаю, что при правильных настройках доступа она вообще не нужна.


<?php
if(isset($_GET["fn"])){
	if(stristr($_SERVER["REQUEST_URI"], $_SERVER["SCRIPT_NAME"]) === false) {
		$fn = $_GET["fn"];
		if(file_exists($fn) === true){
			$direct = 'y';
			require_once('core.php');
		}else{
			$type = 404;
			require_once('error_report.php');
		}
		require_once('core.php');
	}else{
		require_once('error_report.php');
	}
}else{
	require_once('error_report.php');
}
?>



С удовольствием выслушаю комментарии относительно её ошибочности.

Спасибо за внимание!
Tags:
Hubs:
-5
Comments42

Articles