Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Мини-статья о ЧПУ

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
Stierus Супермодератор
Отправлено: 20 Января, 2009 - 11:37:36
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Всё чаще на форуме стали появляться вопросы, связанные с ЧПУ (Человекопонятный УРЛ).
В принципе, ничего нового и оригинального в идее понятного УРЛа нет. Про это писал и Лебедев, и другие товарищи. Вообще, мне всегда нравились УРЛы такого, например, вида: http:// forum.php.su/forums/33 . Есть несколько способов реализации задуманного:

1. Создавать подпапки в соответствии с нужной нам структурой сайта. Для форумов и других генерируемых ресурсов, естественно, этот вариант не подходит.

2. Используем возможности страницы ошибок. Когда с сервера запрашивается несуществующая страница, сервер выдает 404 код ответа. Идея заключается в том, что бы прописать в фале .htaccess страницу, которая будет выдаваться при ошибке 404, а уже эта страница будет смотреть на текущий УРЛ и выдавать нужный документ, То есть, в .htaccess пишем:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. ErrorDocument 404 /index.php
  3. ErrorDocument 401 /index.php
  4.  

Пользователь набирает http://forum.php.su/forums/33, такая страница не найдена, и загружается файл index.php. Дальше — все просто. Переменная $_SERVER["REQUEST_URI"] дает нам адрес вызываемой страницы (в данном случае это будет /forums/33), как вывести на экран соответствующий документ — будет описано чуть ниже.
Этого мало. В некоторых браузерах и с поисковиками такой фокус не пройдет: страница 404 будет выдавать соответствующий код, и страницы индексироваться не будут. Поэтому надо, чтобы страница, которая грузится в случае ошибки 404, изменяла бы код ошибки и сигналила, мол, все ОК, есть такая страница: <?php header("http/1.1 200 Ok"); ?>
Итого: прописываем в .htaccess страницу, которая, собственно, за все отвечает (у меня это index.php). В этой странице пишем php-скрипт, который работает с $_SERVER["REQUEST_URI"], шлет заголовок «http/1.0 200 Ok» и отображает то, что надо.

3. Для этих (и не только) целей есть специальный модуль в Апаче, который называется mod_rewrite (для работы модуля, в httpd.conf должна быть раскомментирована строчка "LoadModule rewrite_module modules/mod_rewrite.so"). Он позволяет «переписывывать урлы», то есть, преобразовывать их «на лету» по правилам, которые вы ему опишите.
Это очень мощный модуль, и если вы в нем разберетесь, то сможете творить чудеса. читайте документацию, благо, что ее полно, я лишь покажу, как реализовывал сам :

в .htaccess пишется код:

CODE (text):
скопировать код в буфер обмена
  1. RewriteEngine On            
  2. Options +FollowSymlinks
  3. RewriteBase /
  4.  
  5. RewriteCond    %{REQUEST_FILENAME}    !-f
  6. RewriteCond    %{REQUEST_FILENAME}    !-d
  7. RewriteRule ^index\.html?$ index.php [N]
  8.  
  9. RewriteCond    %{REQUEST_FILENAME}    !-f
  10. RewriteCond    %{REQUEST_FILENAME}    !-d
  11. RewriteRule ^(.*) index.php

, который проверяет, существует ли запрошенный адрес, если нет - перебрасывает на Index.html (если нет - index.php). В index.php, так же, как и в п.2, мы разбираем строку $_SERVER["REQUEST_URI"] :

CODE (text):
скопировать код в буфер обмена
  1. $url = explode("/",$_SERVER["REQUEST_URI"]);


В массиве $url у нас теперь содержатся параметры, переданные в строке браузера, этот массив нам заменяет массив $_GET .

Вобщем-то на этом пока закончу, будут вопросы - задавайте в этом топике.

ps
Как только появится возможность выкладывать форматированный и подсвеченый код - выложу класс , который сильно облегчает работу с $_SERVER["REQUEST_URI"] .

(Отредактировано автором: 20 Января, 2009 - 14:54:37)

 
My status
 Top
CodeWarrior
Отправлено: 20 Января, 2009 - 13:17:41
Post Id



Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Янв. 2009  
Откуда: Албания


Помог: 0 раз(а)




Хорошая статья. Я как раз хотел зазобраться в этом вопросе. Поищу еще информацию и может допишу, что-то свое. Если потребуется.
 
 Top
Владимир
Отправлено: 20 Января, 2009 - 13:40:57
Post Id



Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Янв. 2009  


Помог: 0 раз(а)




так может быть написать цикл статей по .htaccess ? где и это затронуть и не только Улыбка


Stierus з.ы. вот это самое о чем ты и говорил ;) или думал)
 
 Top
Stierus Супермодератор
Отправлено: 20 Января, 2009 - 13:50:14
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




На основе проблем сюда вносить поправки, выложить класс и при каждой новой теме кидать ссылку.
ps
Примерно так думал, только ссылки на учебники вставить надо.
 
My status
 Top
Владимир
Отправлено: 20 Января, 2009 - 13:51:36
Post Id



Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Янв. 2009  


Помог: 0 раз(а)




хм... думаю что можно было бы сделать полный фАК по работе с .htaccess с примерами на основе проблем Улыбка
как идея?)
 
 Top
Ыыы
Отправлено: 20 Января, 2009 - 13:51:55
Post Id



Частый гость


Покинул форум
Сообщений всего: 169
Дата рег-ции: Июль 2008  
Откуда: Россия, Хабаровск


Помог: 0 раз(а)




Цитата:
в .htaccess пишется код:

CODE (text):
скопировать код в буфер обмена
  1. скопировать код в буфер обмена
  2. RewriteEngine On
  3. Options +FollowSymlinks
  4. RewriteBase /
  5.  
  6. RewriteCond %{REQUEST_FILENAME} !-f
  7. RewriteCond %{REQUEST_FILENAME} !-d
  8. RewriteRule ^index\.html?$ index.php [N]
  9.  
  10. RewriteCond %{REQUEST_FILENAME} !-f
  11. RewriteCond %{REQUEST_FILENAME} !-d
  12. RewriteRule ^(.*) index.php


, который проверяет, существует ли запрошенный адрес, если нет - перебрасывает на Index.html (если нет - index.php). В index.php, так же, как и в п.2, мы разбираем строку $_SERVER["REQUEST_URI"] :


ЗАчем все так усложнять?!

Изменить ваш код на этот:
CODE (text):
скопировать код в буфер обмена
  1. скопировать код в буфер обмена
  2. RewriteEngine On
  3. Options +FollowSymlinks
  4. RewriteBase /
  5.  
  6. RewriteCond %{REQUEST_FILENAME} !-f
  7. RewriteCond %{REQUEST_FILENAME} !-d
  8. RewriteRule ^index\.html?$ index.php [N, QSA]
  9.  
  10. RewriteCond %{REQUEST_FILENAME} !-f
  11. RewriteCond %{REQUEST_FILENAME} !-d
  12. RewriteRule ^(.*) index.php [N, QSA]


И все параметры переданные через ГЕТ, будут достпуны через ГЕТ

(Отредактировано автором: 20 Января, 2009 - 13:54:44)

 
 Top
Stierus Супермодератор
Отправлено: 20 Января, 2009 - 13:54:26
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Цитата:
хм... думаю что можно было бы сделать полный фАК по работе с .htaccess с примерами на основе проблем Улыбка
как идея?)


У меня нет проблем с .htaccess, о чем писать - не знаю, по мере появления проблем - будут вносится изменения, добавляться что-то новое (об этом я выше и писал)
 
My status
 Top
Владимир
Отправлено: 20 Января, 2009 - 14:07:01
Post Id



Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Янв. 2009  


Помог: 0 раз(а)




Stierus пишет:
У меня нет проблем с .htaccess, о чем писать - не знаю, по мере появления проблем - будут вносится изменения, добавляться что-то новое (об этом я выше и писал)


не буду комментировать.

Статья хорошая.
 
 Top
MrBlack
Отправлено: 21 Января, 2009 - 04:32:20
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Янв. 2009  


Помог: 0 раз(а)




Я сделал все как по статье.
У меня в массив такой получается.
CODE (text):
скопировать код в буфер обмена
  1. array ( 0 => '', 1 => 'site', 2 => '?t=about', )

а что делать дальше?! что бы была именно подмена?!
что бы все что было тут
http://localhost/site/?t=about отображалось тут http://localhost/site/about

(Отредактировано автором: 21 Января, 2009 - 05:03:45)

 
 Top
Stierus Супермодератор
Отправлено: 21 Января, 2009 - 08:54:24
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Вопрос составьте точнее. ЧПУ созданы для того, что бы вводя в адресной строке браузера "http://localhost/site/about" , в случае, если такого файла не существует, ваш запрос перенаправлялся в другое место (в моём случае это http://localhost/index.php ), т.е. человек в адресной строке ввёл одно, но на самом деле сервер отображает страницу, сгенерированную другим скриптом .

ps
Что вы имеете ввиду под "подмена" - я не знаю. Касательно именно вашего случая, вам просто нужны другие правила в .htaccess, какие именно - вам отписали в вашем посте.
 
My status
 Top
CodeWarrior
Отправлено: 21 Января, 2009 - 13:39:23
Post Id



Частый гость


Покинул форум
Сообщений всего: 157
Дата рег-ции: Янв. 2009  
Откуда: Албания


Помог: 0 раз(а)




Кстати, я не знаю одного: будет ли переполняться лог апача при постоянном обращении к несуществующим ресурсам?
 
 Top
Stierus Супермодератор
Отправлено: 21 Января, 2009 - 13:44:04
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Если ты про 3-й пункт - записей не будет, ибо это нормальное поведение, если про 2-й - скорее всего, придётся настраивать ведение логов апача (этим способом не пользовался, чисто логически, логировать должно, на практике не проверял).
 
My status
 Top
Вездеход
Отправлено: 27 Декабря, 2009 - 13:36:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


Помог: 0 раз(а)




CODE (text):
скопировать код в буфер обмена
  1.  
  2. RewriteEngine on
  3. RewriteCond $1 !^(index\.php|login\.php|reg\.php|robots\.txt|theme/)
  4. RewriteRule ^(.*)$ /index.php/$1 [L]


а у меня вот так... =)
сюда тока надо еще дописать на 404ю ошибку строку, и нормально


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
freeman7162
Отправлено: 01 Февраля, 2010 - 18:16:07
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




По поводу статей: здесь http://www[dot]younik[dot]ru есть кое-что полезное, может ещё кому-нибудь кроме меня поможет.
 
 Top
SAD
Отправлено: 06 Марта, 2010 - 22:56:29
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




Вот тоже решил восп. этой фичей, прописал
CODE (htmlphp):
скопировать код в буфер обмена
  1. RewriteEngine On
  2. RewriteRule ^kurs/([^/]*)\.html$ /index.php?kurs=$1 [L,QSA]

сам адрес http://сайт/index.php?kurs=2
Но ничего не происходит, если написать какую нибудь бредятину- ошибку выдает.
Хостинг бесплатный, не знаю в чем прикол

(Отредактировано автором: 06 Марта, 2010 - 23:10:44)

 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Обсуждение статей »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB