Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: .htaccess RewriteEngine
 
 автор: Deed   (26.03.2012 в 19:56)   письмо автору
 
 

Доброго времени суток вам!
Заранее извините за "скатерть", но я уже похудел на два килограмма...
Проблема вот в чем.
1. Денвер.
2. Кодировка сайта - windows-1251.
3. В .htaccess (после двух недель ломания мозгов):

RewriteEngine On
RewriteRule ^we$ index.php?page=we [L]
RewriteRule ^register$ index.php?page=register [L]
RewriteRule ^(news)(/([\d]+))$ index.php?page=news&name=$3 [L]
RewriteRule ^(user/)([\d\wа-яА-ЯёЁ-]{2,19})$ index.php?page=user&name=$2 [L]
RewriteRule ^(errors)/(40[\d])$ index.php?page=errors&name=$2 [L]
RewriteRule ^(\/.*)(\/)*$ /$1 [R=301,L]
ErrorDocument 401 /errors/401
ErrorDocument 403 /errors/403
ErrorDocument 404 /errors/404
ErrorDocument 500 /errors/500

То есть, я хотел сделать ЧПУ вроде:
http://site.ru/user/Deed
вместо обычного:
http://site.ru/index.php?page=user&name=Deed
(http://site.ru/news/3502 вместо http://site.ru/index.php?page=news&name=3502 и т.д.)
Все работает, НО, стОит в адресной строке добавить в конце URL слэш "/", вылетает:

"Forbidden
You don't have permission to access /Z:/home/query.std/www/user/Deed// on this server.
Подсказка Денвера
Возможные причины ошибки:
Вы пытаетесь запустить CGI-скрипт, расположив его вне CGI-директории (например, в директории документов сервера www)..."

А если имя пользователя будет кириллическим получаю "Error 404". Если же к этой кириллице добавить и слэш, то на странице ошибки нарушаются абсолютные пути к CSS, скриптам, графике... То есть пага думает, что она находится в каталоге и к путям требуется приписывать выход в корневую директорию:
"../"
Причем, чем больше слэшей приписано в конце URL, тем более глубоким становится такое "вложение".

В общем, вопроса два:
1. Как заставить сервер игнорировать эти слєши в конце URL?
2. Как подружить .htaccess с windows-1251?

Большое человеческое спасибо.

  Ответить  
 
 автор: Sfinks   (27.03.2012 в 00:25)   письмо автору
 
   для: Deed   (26.03.2012 в 19:56)
 

> 1. Как заставить сервер игнорировать эти слєши в конце URL?
Тут как бы игнорировать - никак. Варианта 2.

Первый - сделать чтоб редирект осуществлялся и со слешем и без слеша. Для этого правила нужно исправить примерно так:
RewriteRule ^news/(\d+)/?$ index.php?page=news&name=$1 [L]
(вы заметили что я стер кучу лишних символов и 2 дописал?). Чтобы после этого работали скрипты, css и пр., указывайте к ним относительный путь от корня сайта. Типа '/js/script.js'. Так надежнее всего.

Второй вариант - проверять на наличие слеша и при его обнаружении внешний редирект. Тогда правила такие:
RewriteRule ^(news/\d+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteRule ^news/(\d+)$ index.php?page=news&name=$1 [L]


> 2. Как подружить .htaccess с windows-1251?
В .htaccess кирилицы быть не может. Ее нужно указывать через ASCII-коды. Примерно так:
RewriteRule ^user/([\d\w\-\x7f-\xff]{2,19})$ index.php?page=user&name=$1 [L]

  Ответить  
 
 автор: Deed   (27.03.2012 в 13:22)   письмо автору
 
   для: Sfinks   (27.03.2012 в 00:25)
 

Спасибо, Sfinks!
Приду с работы, буду разбираться.

19-36

Как-то не видно изменений... Но за примеры, Sfinks, колоссальное спасибо! Они помогают глубже понять смысл и тонкости синтаксиса .htaccess.

Я бы дополнил свой вопрос.
Как научить сервер игнорировать любые посторонние символы, в том числе и слєши (прямые и обратные), приписанные в конце URL'a в адресной строке.
Вот такая вот конструкция не работает:

RewriteRule ^(news)(/([\d]+))[^\d]?$ index.php?page=news&name=$3 [L]
RewriteRule ^(news/\d+)[^\d]?/$ http://%{HTTP_HOST}/$1 [R=301,L]

Эх...

21-16

Нашел-таки "методом тыка" топорное и частичное решение:

AddDefaultCharset Windows-1251
RewriteEngine On
RewriteBase /
RewriteRule /index.php?%{REQUEST_URI} [L]
RewriteRule ^(we)[.\\]*$ index.php?page=$1 [L]
RewriteRule ^register$ index.php?page=register [L]

RewriteRule ^(news)(/([\d]+))[^\d]*$ index.php?page=news&name=$3 [L]
RewriteRule ^(news)(/([\d]+))/*$ index.php?page=news&name=$3 [L]
RewriteRule ^(user)(/[\d\w-\x7f-\xff]{2,19})(/|\\)*$ index.php?page=user&name=$2 [L]
RewriteRule ^(errors)/(40[\d])$ index.php?page=errors&name=$2 [L]
RewriteRule ^errors/(500)$ index.php?page=errors&name=$1 [L]
RewriteRule ^(.+)(/|\\)*$ $1 [L]
ErrorDocument 401 /errors/401
ErrorDocument 403 /errors/403
ErrorDocument 404 /errors/404
ErrorDocument 500 /errors/500

Но теперь не работает правило с пятисотой ошибкой - упорно открывается апачевская страница Internal Server Error, хотя Error 404 работает хорошо...

P.S. Уважаемый Sfinks!
Проблему с крякозябрами в параметре $_GET['name'] в случае кириллицы в запросе (имя пользователя), решил обработкой iconv("utf-8","windows-1251",$_GET['name']).
Спасибо Вам за регулярку! Но как в .htaccess задать в ней игнор регистра букв?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования