|
|
|
| Доброго времени суток вам!
Заранее извините за "скатерть", но я уже похудел на два килограмма...
Проблема вот в чем.
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?
Большое человеческое спасибо. | |
|
|
|
|
|
|
|
для: 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]
|
| |
|
|
|
|
|
|
|
для: 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 задать в ней игнор регистра букв? | |
|
|
|