Наверно так положено (есле не принять каких-то специальных мер).
Например в сети есть следующее:
... почти всегда на Apache ставится модуль mod_dir, который открывает файл index.php при обращении к папке, его содержащей...
и еще:
... особенность работы модуля mod_dir, при которой если происходит запрос файла, являющегося директорией, но запрос не оканчивается знаком слэш, то mod_dir осуществляет внешнюю переадресацию на тот же адрес со знаком слэша в конце.
т.е. проблема, возникшая перед Вами вызвана тем, что .htaccess (при некоторых условиях) делает внутреннюю переадресацию (добавляя в середину адреса директорию DIR, но не проверяя при этом наличия слэша в конце адреса, и не добавляя его при необходимости)
а затем (если не хватает слэша) начинает действовать mod_dir, делая внешний редирект на измененный в .htaccess адрес с добавлением слеша (и показывая пользователю что на самом деле все лежит в DIR)
-=Den=-: получается если папок 10 штук, все прописывать?
Если всего десяток и предполагается что папки не будут активно плодиться, то не проблема и для каждой прописать свой редирект. Некоторые пишут сотни строк.
ParserYa: Копирую ваш скрипт к себе, предварительно подключив БД - никаких отрицательных значений нет.
А у меня есть отрицательные значения.
Что не удивительно, потому что на localhost стоит PHP Version 4.4.0 и естественно параметр get_as_float не работает и функция microtime выдает строку в любом случае.
У Вас преобразованный URI "brands/detail.php..." подходит для этого же правила преобразований "^brands/(.*)\.php" и правило применяется к нему снова и снова, вызывая зацикливание и вывод 500 ошибки. Нужно не допускать повторного преобразования, добавив перед правилом условие, проверяющее, что преобразование еще не сделано:
Тогда попробуйте такой прием:
условие - если запрашиваемый документ это папка
правило - реврайт на индексный файл в этой папке
RewriteRule ^folder1/ folder1/index.php [L]
Но как я понял, такая строчка просто редиректит на folder1/index.php все, что лежит внутри folder1
А Вы сделайте так, чтоб правило не затрагивало то, что лежит внутри folder1 (используйте символ конца строки в регулярке)
Это так и положено или сервер криво настроен?
Наверно так положено (есле не принять каких-то специальных мер).
Например в сети есть следующее:
... почти всегда на Apache ставится модуль mod_dir, который открывает файл index.php при обращении к папке, его содержащей...
и еще:
... особенность работы модуля mod_dir, при которой если происходит запрос файла, являющегося директорией, но запрос не оканчивается знаком слэш, то mod_dir осуществляет внешнюю переадресацию на тот же адрес со знаком слэша в конце.
т.е. проблема, возникшая перед Вами вызвана тем, что .htaccess (при некоторых условиях) делает внутреннюю переадресацию (добавляя в середину адреса директорию DIR, но не проверяя при этом наличия слэша в конце адреса, и не добавляя его при необходимости)
а затем (если не хватает слэша) начинает действовать mod_dir, делая внешний редирект на измененный в .htaccess адрес с добавлением слеша (и показывая пользователю что на самом деле все лежит в DIR)
получается если папок 10 штук, все прописывать?
Если всего десяток и предполагается что папки не будут активно плодиться, то не проблема и для каждой прописать свой редирект. Некоторые пишут сотни строк.
RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?)
RewriteRule .* %1/ [L]
добавляет слэш, после любой папки. как такое решение?
Не очень.
У Вас реврайт, а не редирект.
Получается что по двум адресам (со слэшем и без) будет получаться одинаковое содержимое, т.е. будут дубликаты страниц.
Лучше все-таки сделать 301 редирект, и с проверкой, что папка существует в директории DIR
Если адрес заканчивается строкой (не содержащей точек и слэшей) или после этой строки идет знак вопроса
+
Если эта строка является поддиректорией директории DIR
=
Выполняется 301 редирект на тот же адрес с добавлением слэша
Перед теми строками, что Вы привели добавьте строку редиректа на адрес со слешем:
301 редирект любых документов из корневой папки сайта site.ru в папку folder
Копирую ваш скрипт к себе, предварительно подключив БД - никаких отрицательных значений нет.
А у меня есть отрицательные значения.
Что не удивительно, потому что на localhost стоит PHP Version 4.4.0 и естественно параметр get_as_float не работает и функция microtime выдает строку в любом случае.
maxttor, посмотрите, что возвращает функция microtime, например здесь, и Вам все станет понятно.
Кстати там кажется есть вариант правильного измерения времени.
RewriteRule ^brands/(.*)\.php /brands/detail.php?code=$1&%{QUERY_STRING} [L]
Выдает 500 ошибку.
У Вас преобразованный URI "brands/detail.php..." подходит для этого же правила преобразований "^brands/(.*)\.php" и правило применяется к нему снова и снова, вызывая зацикливание и вывод 500 ошибки. Нужно не допускать повторного преобразования, добавив перед правилом условие, проверяющее, что преобразование еще не сделано: