Почему установлено перенаправление в .htaccess, но скрипт срабатывает несколько раз?

Необходимо, чтобы в подпапке все запросы уходили на index.php. Структура запросов планируется такая: site.ru/cabinet/show/post/

Есть папка на сайте: site.ru/cabinet/. В ней лежит .htaccess:
RewriteEngine on
RewriteBase /cabinet/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule  ^([^.]+[^./])$  $1/  [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -l
RewriteCond %{REQUEST_FILENAME} -d 

RewriteRule ^.*$ [NC,L]
RewriteRule ^.*$ index.php [NC,L]


Index.php такой:
<html>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<head>
	<title>Проверка</title>
	<link rel="stylesheet" type="text/css" href="files/screen.css">
	<link rel="stylesheet" type="text/css" href="files/main.css"> 
</head>
<body>
<?
	$mailmes="Проверка";
	$send_to = "test@mail.ru";
	$subject = "Проверка";
	$headers = "From: cabinet <test@mail.ru> \n";
	$headers .= "Content-type: text/html; charset=UTF8\r\n";
	$send = mail($send_to, $subject, $mailmes, $headers);
?>
</body>
</html>


Проблема в том, что при каждом запросе на странице обрабатывается скрипт. Например, в приведенном выше index.php письмо отправляется 3 раза. Один раз на запрос самой страницы, и еще два раза на подключения двух файлов CSS.

Понимаю, что это происходит из .htaccess, а конкретно из-за строчек:
RewriteRule ^.*$ [NC,L]
RewriteRule ^.*$ index.php [NC,L]


Но если убрать первую строку, то скрипт не может обработать такой вот запрос: site.ru/cabinet/show/, сразу выходит 404 страница. С текущей конфигурацией .htaccess все работает нормально, не считая повторяющихся обработок скрипта.

Вопрос. Как верно настроить .htaccess, чтобы скрипт выполнялся всего один раз на запуск страницы, как и положено?
  • Вопрос задан
  • 2940 просмотров
Решения вопроса 1
svd71
@svd71
Дело в том, что выперенаправляете ВСЕ запросы на index.php. В самом index.php идет обращение идут линки на получение css файлов. Делайте в index.php анализ того, что запрашивается и выдавайте правильный файл.

----

index.php должен начинаться с таких строк:

<php
$url = $_SERVER['REQUEST_URI'];

if (strpos($url,  "/screen.css" > 0) {

//здесь может потребоваться вывод хэдера для css контента. смотрите на php.net
// тема про хэдер
echo file_get_content($_SERVER['DOCUMENT_ROOT']."files/screen.css");
die();
}

//точно так же повторяем для второго css файла
// для случаев таких файлов вывод прекращается по die()
// для index.php обработка идет дальше
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
nazarpc
@nazarpc
Open Source enthusiast
Думаю, вам будет полезно один раз прочитать и досконально разобраться как работает mod_rewrite:
habrahabr.ru/company/sprinthost/blog/129560
Там и про зацикливание сказано
Ответ написан
@daMage
Уточните htaccess:
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Ответ написан
@Vampiro
а я бы задал пути для css и js от корня сервера и не выносил моск....
link rel="stylesheet" type="text/css" href="/css/screen.css">
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы