Всем привет. Не знаю как правильно задать вопрос но попробую. В htaccess с помощью rewrite engine делаю крассивые адреса типа. site.ru/forum Проблема заключается в следующем. Если в корне сайта есть такая директория то он откроет ее напрямую. Как сделать чтобы после site.ru/ можно было указывать имена папок которые есть в корне сайта и apach не думал что мы хотим открыть директорию на прямую
Если это типовое правило рерайта (кстати, где листинг?) то достаточно убрать проверку на существование объектов в файловой системе и тогда будет жесткий рерайт всех запросов.
Код (Text): AddType application/x-httpd-php .php .php5 .phtml .html .htm <FilesMatch ".(gif|jpg|jpeg|png|js|css)$"> Header set Cache-Control "max-age=2592000" </FilesMatch> DirectoryIndex main/index.html RewriteEngine on RewriteBase /main/index.html RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([A-Za-z0-9-]+)$ index.html?page=$1 [QSA] RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)$ index.html?page=$1&val=$2 [QSA] RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)$ index.html?page=$1&val=$2&val2=$3 [QSA]
Код (Text): RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f "если в файловой системе нет такого каталога и нет такого файла то применяем правила ниже" - вот эту секцию убрать и тогда правила ниже будут выполняться безусловно Код (Text): RewriteRule ^([A-Za-z0-9-]+)$ index.html?page=$1 [QSA] RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)$ index.html?page=$1&val=$2 [QSA] RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)$ index.html?page=$1&val=$2&val2=$3 [QSA] для чистоты кода можно делать один рерайт на пхп-машину и уже внутри неё делать разбор исходного адреса запроса То есть: Код (Text): RewriteRule ^([A-Za-z0-9-]+)$ index.html [QSA] и внутри пхп-скриптов любоваться на $_SERVER['REQUEST_URI'] ЗЫ. Почему расширение у файла - html?
Щас попробуем. Расширение у файла html для того чтобы сократить количество файлов на сайте, потому что зачастую на один php файл приходится один html. А так включил с помощью .htaccess использование php в html и файлов раза в два меньше. Если не прав поправьте. --- Добавлено --- Не работает всеравно лезет в каталог и открывает дерево
Самое интересное, что если использовать мои rewriteRule то При переходе site.ru/test открывается дерево каталога Если же ввести site.ru/test/123 то тут уже работает как надо
Логически правильно оставить html-файл, который был придуман быть статическим - статическим html-файлом. Так веб-сервер быстрее отдаст его в поток и не будет выполнять лишние действия по запуску интерпретатора пхп и тот в свою очередь не будет заниматься разбором и выполнением лексем. Рекомендую включить отладку рерайтера и почитать логику разрешения запроса
Я обращаюсь на форумы только в самом крайнем случае, когда гугл совсем не помог с проблемой. Помогите пожалуйста с данной проблемой.
Как я понял, проблема таится тут Код (Text): ^([A-Za-z0-9-]+)$ Так как попробовав изменить на это Код (Text): RewriteRule test main/index.html [QSA] Все заработало. Вопрос: ^([A-Za-z0-9-]+)$ где здесь ошибка?
Как? Последовали совету выше? Что за хрень у вас в RewriteBase? --- Добавлено --- Не надо так делать. Делайте рерайт html- в php-файлы при наличии в последних. А чтобы не было дублей, «спрячьте» каталог с php-файлами. --- Добавлено --- И советую обратить особое внимание на совет про рерайт на фронт без «трансляции параметров». Гляньте мою статью Как сделать единую точку входа с ЧПУ?
Код (Text): RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^.* /index.php Этим вы просто вырубили на корню мою проблему с рерайтом. Спасибо. Тоесть вы советуете использовать исключительно php файлы а в них инклюдить html?
Я не советую «инклюдить html», а советую парсить исходный адрес самостоятельно, чтобы не переливать из пустого в порожнее и не писать трехэтажные правила для сервера. --- Добавлено --- Сейчас почти все движки так работают --- Добавлено --- ...если не полный парсинг адреса, то хотя бы проверка попадания под адресную маску из списка. --- Добавлено --- Реакция на результат парсинга/попадание по маску может быть совершенно различной. Что нужно, то и пишите в обработчиках.
Извините не совсем вас понимаю. На данный момент логика загрузки страниц следующая. 1. Указываем в адресной строке страницу, которую хотим отобразить, допустим site.ru/profile 2. С помощью .htaccess site.ru/profile перенаправляем в index.html 3. В index.html подключается скриптовый файл с помощью которого мы получаем параметры из адресной строки. 4. С помощью параметров получуных из ссылки подгружаем ajax нужный нам файл, в нашем случае допустим profile.html
Я прежде всего вам советовал не делать «трансляцию параметров», т.е. не преобразовывать компоненты пути из исходного адреса в GET-параметры при рерайте. Вместо этого обрабатывать исходный адрес в скрипте самостоятельно. Что из себя представляет эта обработка, в данном случае не так важно. Можно сделать все, что угодно. Рерайт, PHP-код – все это работает исключительно на стороне сервера, с AJAX-ом непосредственно не связано. Чтобы вычитывать статичный html-файл AJAX-ом, собственная программная обработка на сервере вообще не требуется. Достаточно проверять статус на клиенте: получили ответ 404 - нет такого файла. Но можно и обрабатывать. Как именно, опять-таки не суть. Я бы например предпочел читать запись profile из БД, а не файл profile.html, например http://g09.ru/index.html --- Добавлено --- Вы своим .html только вносите путаницу. Из контекста не совсем понятно, profile.html – это статичный файл или требующий выполнения динамичный.
Зачем ajax то, просто выводим то что нам "надо" хоть ваш profile.html , если "надо" нет то 404 А вы готовый сайт на чпу перводите или новое что то пишете? Сорри опоздал вам про ajax вроде объяснили...
Вы мне скинули вашу статью, я и воспользовался этим правилом RewriteRule ^.* main/index.html. Соотвественно теперь не преобразую в GET. Ни как не пойму, что вы пытаетесь сказать, по поводу того что я использую html файлы вместо php. У меня в htaccess включено рарешение в html использовать php. Чтобы избежать файлов типа index.php в котором лежит один единственный include ("homepage.html"); На мой взгляд проще создать файл homepage.html в котором с помощью php вывести допустим список новостей P.S. с вами можно связаться голосом? --- Добавлено --- Всмысле зачем ajax. Чтобы контент подгружался без надобности перезагружать всю страницу И да, пишу чтото новое
К пред. посту. Да, AJAX зря приплели. Для AJAX-а «крассивые адреса» как раз-таки не требуются. Но если они нативные, то почему бы и не использовать. Можно даже по одним и тем же адресам выдавать соотв. контент и под AJAX-запросы и под обычные, например под AJAX-запросы – разметку только осн. содержимого, а под обычные – полную разметку страниц.
Понятное дело, что ajax и url никак не связаны. Я просто рассказал логику загрузки страниц. Страницы в формате html чтобы верстальщики смогли вестать в привычной им среде. Как во многих CMS вам не дается код движка, вам дается html страница которую вы и меняете под свои нужны. Тоже самое и я делаю.
Вам уже два человека здесь сказали, что лучше так не делать. Вы используете самое популярное для php-фронта имя файла фиг знает с какой целью. Используйте единый фронт и выводите по адресу / главную. Проще закрепить какое-то действие непосредственно за адресом /, а имя файла обработчика можете формировать, исходя из адреса, или хранить его в структуре данных, которая отвечает за связку адреса с обработчиком. Нет. --- Добавлено --- ...можете задавать вопросы тут или в комментах к моей статье по ссылке выше. --- Добавлено --- А я вам написал, что для вычитывания статика AJAX-ом рерайт, пых на сервере вообще не нужны. Если это статик, пожалуйста. Но там не должно быть PHP-кода, поэтому и выполнять такие файлы не нужно. И верстальщики предпочитают работать с полными страницами, а в ответ на AJAX-запросы гораздо лучше отдавать только основное содержимое.
Проблема что мы немного не помнимаем друг друга. Мне нужно чтобы была единая html разметка для всех страниц HTML: <html> <head></head> <body></body> </html> В эту разметку с помощью ajax между тегами <body></body> подгружается страница с помощью ajax. Вы предлагаете сделать чтобы рерайт всех адресов в файл index.php а уже в этом файле подключить понятный для верстальщиков файл html?
К пред. посту. Кстати, у нас верстальщики вполне себе дружат с шаблонами основного содержимого без общего обвеса. Знают алг. структуры на пыхе для закручивания однотипных блоков в циклы и т.п.
А как тогда быть если я допустим хочу вывести на странице ник пользователя <div><?echo $username;?></div> Так тоже не привествуется?