mod_rewrite, о наболевшем :)

DpoHro

Новичок
mod_rewrite, о наболевшем :)

Вот не панацея, но с некоторыми модификациями можно использовать :)

############################################################################################
#
# Файл .htaccess написан в помощь web-разработчикам-новичкам :) таким же новичком :)
# для создания ЧПУ (человеко-понятных урлов), готов к применению
#
# При написании были использованы:
# Apache HTTP Server Documentation Project: http://httpd.apache.org/docs-project/
# Материалы сайта: http://phpclub.ru
#
# Автор файла: Зверев Валентин (DpoHro)
# На связи: zverev[тра-ля-ля]cps.tver.ru
#
############################################################################################


############################################################################################
#
# Переадресация обработки ошибки
# Директива ErrorDocument служит для указания серверу сценария обработки ошибок
# Формат: ErrorDocument <код ошибки> <путь к скрипту-обработчику>
#
############################################################################################

ErrorDocument 404 /errors/error404.html
#ErrorDocument <code> /errors/error<code>.html

############################################################################################
#
# Врубаем движок перезаписи
# Перезапись производится следующим образом:
# На каждый модуль - отдельная виртуальная папка
# Виртуальная папка создается путем создания правила для определенных URL, например,
# хотим создать папку /user/ тогда пишем правило:
#
# RewriteRule ^user[/](.*)[/](.*).html[/]$ ./index.php?module=user&param=$1&page=$2 [QSA]
# RewriteRule ^user[/](.*).html[/]$ ./index.php?module=user&page=$1 [QSA]
#
# Здесь первая строка указывает что адреса вида
# http://www.domain.ru/user/somedir/somefile.html
# http://www.domain.ru/user/somedir/
# будут переписаны как
# http://www.domain.ru/index.php?module=user&param=somedir&page=somefile
# http://www.domain.ru/index.php?module=user&page=somefile
#
# Далее один уровень - подкаталогов
# Далее файл с расширением .html
# Вид урла: http://www.domain.ru/module/somefilder/somefile.html
#
############################################################################################

#<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On

############################################################################################
#
# Директива RewriteBase указывает физический путь относительно которого будут располагаться
# перезаписываемые страницы.
#
############################################################################################

RewriteBase /


############################################################################################
#
# Запрещаем доступ к файлам .htaccess и директориям
# Как работает RewriteRule
# Формат: RewriteRule <разбор входящей (перезаписываемой) строки> <составление новой (записываемой) строки>
# Разбор вх. строки производится при помощи спец. символов:
#
# Текст:
# . - один символ (в данном месте стоит какой-либо символ)
# [chars] - один из символов (в данном месте стоит один из перечисленных символов)
# [^chars] - ни один из символов (в данном месте не стоит ни одного из перечисленных символов)
# text1|text2 - Либо text1, либо text2
#
# Повторители:
# ? - 0 или 1 раз повторяетсяпредшествующий текст
# * - 0 или N раз повторяетсяпредшествующий текст
# 1 - 0 или N раз повторяетсяпредшествующий текст
#
# Якори:
# ^ - Начало разбираемой строки
# $ - Конец разбираемой строки
#
# Экранирование:
# \char - Возможно такое, что служебные символы будут присутствовать в перезаписываемом тексте
# и чтобы возможно было разобрать подобное выражение нужно будет указать, чтобы они не принимались
# за служебные, это производится установкой перед ними обратного слеша (экранирование)
# Например: ^/\((.*)\)/$ будет проинтерпретирован как строка запроса /(sometext)/ и из нее
# в переменную $1 будет помещен текст sometext
#
############################################################################################

RewriteRule ^.htaccess - [F] # незачем знать, что написано в этом самом файле хотя он вроде по умолчанию недоступен
RewriteRule ^admin - [F] # нех лазить по физической директории CMS
RewriteRule ^settings.php - [F] # нех лазить по файлу с настройками

############################################################################################
#
# разрешаем доступ к существующим файлам и директориям (если это требуется)
# Директива RewriteCond. Это своего рода условный оператор
#
# Формат: RewriteCond %{NAME_OF_VARIABLE} ^formated-string*
#
# NAME_OF_VARIABLE - это предопределенные переменные перечисленные ниже
#
# HTTP-заголовки:
#
# HTTP_USER_AGENT
# HTTP_REFERER
# HTTP_COOKIE
# HTTP_FORWARDED
# HTTP_HOST
# HTTP_PROXY_CONNECTION
# HTTP_ACCEPT
#
# Коннекты и запросы:
#
# REMOTE_ADDR
# REMOTE_HOST
# REMOTE_USER
# REMOTE_IDENT
# REQUEST_METHOD
# SCRIPT_FILENAME
# PATH_INFO
# QUERY_STRING
# AUTH_TYPE
#
# Внутренние переменные сервера:
#
# DOCUMENT_ROOT
# SERVER_ADMIN
# SERVER_NAME
# SERVER_ADDR
# SERVER_PORT
# SERVER_PROTOCOL
# SERVER_SOFTWARE
#
# Системные переменные:
#
# TIME_YEAR
# TIME_MON
# TIME_DAY
# TIME_HOUR
# TIME_MIN
# TIME_SEC
# TIME_WDAY
# TIME
#
# Специальные:
#
# API_VERSION
# THE_REQUEST
# REQUEST_URI
# REQUEST_FILENAME
# IS_SUBREQ
#
# Пример:
# RewriteCond %{REMOTE_HOST} ^host1.* [OR,NC]
# RewriteCond %{REMOTE_HOST} ^host2.* [OR,NC]
# RewriteCond %{REMOTE_HOST} ^host3.* [NC]
# RewriteRule ^/$ - [F]
# Запрещаем вход на сайт с хостов host1,host2,host3
#
# Есть два полезных флага [OR] означает чтото типа "или следующее условие"
# это если их два или более подряд идущих и выполняться должно хотябы одно из них,
# и флажок [NC] - назначение "не учитывать регистр"
#
# Насамом деле RewriteCond я бы использовал для того, чтобы ограничивать/расширять доступ
# юзерам/агентам, в зависимости от параметров содержащихся в переменных, которые они
# приносят вместе с собой :)
# То есть, роботов и гостей с опредеделенных IP , например, блокируем, Другие гостям с опять же
# определенных адресов обрабатываем одним скриптом, оставшихся по умолчанию
#
############################################################################################

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

############################################################################################
#
# добавляем слеш в конце пути. Это необходимо для того, чтобы ссылки вида:
#
# http://www.domain.ru/news
# и
# http://www.domain.ru/news/
#
# обрабатывались одинаково
#

RewriteRule ^(.+[^/])$ $1/ [QSA]

############################################################################################
#
# обработка директории ошибки
# один скрипт на обработку всех ошибок, в нем можно ставить редиректы, чтобы пользователю
# не выдавались пресловутые надписи о невозможности чего-либо при помощи вашего сайта,
# а предлагалось бы найти информацию воспользовавшись поиском
#

RewriteRule ^errors/error(.*).html[/]$ ./errors/error.php?code=$1 [QSA]


############################################################################################
#
# обработка директории модуля USER
#

RewriteRule ^user[/](.*)[/](.*).html[/]$ ./index.php?module=user&param=$1&page=$2 [QSA]
RewriteRule ^user[/](.*).html[/]$ ./index.php?module=user&page=$1 [QSA]

############################################################################################
#
# обработка директории модуля ADMINISTRATOR
# папка Content Management System (CMS) расположена произвольно, адрес доступа
# http://www.domain.ru/administrator/index.php
#

RewriteRule ^administrator[/]index.php[/]$ ./admin/index.php [QSA]

############################################################################################
#
# обработка корневой директории. так как это последнее правило, то тут необходимо исключить
# возможное включение слешей в пути к странице, другими словами, чтобы было невозможно обработать
# путь вида http://www.domain.ru/somedir/somedir/file.html, если не найдена ни одна из выше
# обрабатываемых директорий, делаем это исключением из пути слешей записью [^/]
#

RewriteRule ^([^/]+).html[/]$ ./index.php?page=$1 [QSA]

#</IfModule>

############################################################################################
#
# Теперь как все должно быть в коде...
# Смысл этого всего в том, чтобы будь то поисковик будь то реальный пользователь не видел
# охрененных URLов типа http://www.domain.ru/index.php?m=news&d=21&m=11&y=04&col=11&id=12345
# и при этом, трудно воспроизводимых.
#
# Следовательно, при использовании mod_rewrite ваш скрипт должен генерить ссылки вида:
# http://www.domain.ru/news/14112005/hotnews.html
# а принимать ссылку вида
# http://www.domain.ru/index.php?module=news&date=14112005&category=hotnews
# Ну или такую ссылку которую вы задумаете и опишите в этом файле
#
# Так что структура сайта должна быть основательно продумана заранее, затем должен быть
# написан сейфайл как надо, а уж после приступайте к коду
#
# Удачи! Мыльте на: zverev[тра-ля-ля]cps.tver.ru
# Может кто поправит/дополнит и сподобимся вместе написать более подробную весчь :)

-~{}~ 16.11.05 22:51:

Да, это .htaccess :D
 

Лысый

Новичок
ага
пасиб большое
популярно написано..
но вопрос далее - вот я вс это прописал и модуль подрубил и правила прописал
видимо они срабатывают, так как "Ноу сач файл и тд " не пишет
но как то они не так срабатывают - в логах 404 - но это нормально как я понял
а на экране - No input file specified.

вопрос - как отлаживать что происходит? какие то логи ведутся по поводу реврайта?
 

DpoHro

Новичок
Немного не понял что именно происходит? Ты подчистую переписал файл или чтото изменил? Если да то какая ссылка выдает ошибку и что должно быть?
 

Лысый

Новичок
неа.. я вообще всё сам писал....
глянь тут http://phpclub.ru/talk/showthread.php?s=&threadid=77029&rand=3

просто всё сделано по правилам , но ХЗ отчего не пашет

-~{}~ 01.12.05 20:03:

ссылка типа сайт/print/ля ля ля ля
выдаёт No input file specified
в логе /print/ля ля ля ля - 404

а должно в скрипт попасть и он бы мне что нить ответил ...

-~{}~ 01.12.05 20:08:

ни у самое главное - это у меня всё под виндой
апач 2.0 пхп 4.4
на вирт хостинге под юнихом это всё пашет
а тут нет

-~{}~ 07.12.05 10:32:

включил логи - разобрался в своей ошибке

возник вопрос по синтаксису паттернов

как мне модифицировать
RewriteRule ^([0-9A-Za-z]+)?/?([0-9A-Za-z]+).htm?$ /script.php?dir=$1&file=$2 [QSA]


чтоб оно разбирало пути типа "число/число(слово).htm" или "число/"

то есть сейчас оно "число/число(слово).htm" корректно обрабатывает, лишнего в пути не пускает, но вот вставить ИЛИ никак не получается...
спасибо.
 
Сверху