---
title: ЧПУ с mod_rewrite
date: 2007-05-30T10:00
tags: [php, server, tech]
---

Человеко-понятный URL нужен. Так наглядней видеть где вы находитесь. Реализовать ЧПУ можно несколькими способами.

#### (Apache) mod_rewrite

В зависимости от архитектуры web-системы, загрузка отдельных модулей происходит как правило если не напрямую через GET запрос, то хотя-бы косвенно. Косвенно это когда создаётся страница, а потом специально для неё создаётся путь, сохраняется в БД, изменяем и красив.

[Преобразование](http://www.seobility.com/articles/01/) разных параметров в папки по-моему самое нужное. Включаем mod_rewrite, создаём или дописываем .htaccess что-бы работало всё так:

http://kurapov.name?**mod**=gallery&**action**=list&page=5  
http://kurapov.name/gallery/list/?page=5

```
Options +FollowSymLinks  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteEngine On  
RewriteRule ^([A-Za-z0-9^/]+)/([A-Za-z0-9_^/]+)/$ /index.php?mod=$1&action=$2 [QSA,L]  
RewriteRule ^([A-Za-z0-9^/]+)/([A-Za-z0-9_^/]+)/?$ /index.php?mod=$1&action=$2 [QSA,L]
```

---

Самое главное это конечно же RewriteRule, которое построено на [регулярных выражениях](http://www.regular-expressions.info/tutorial.html) , поэтому многие веб-разработчики и не прошли через этот участок. В данном примере в URL ищется в начале (знак **^**) две папки, названия которых состоят из букв и цифр. Первая папка становится значением $1, вторая соответсвенно $2. В итоге запрос передаётся в обработку в index.php с GET параметрами. Параметр QSA=query string append добавляет в конец ещё параметры которые запрашивал пользователь.

### Установка ЧПУ на существующую систему

Какой получается минус? Если есть файл resources/thumbs/generator.php , то получится что обращение тоже будет перезаписываться, и в действительности будет всё идти на index.php. Более того, если система была спроектирована по относительным путям, где все картинки, фреймы, ссылки не велись от корня, то возникнет проблема с новой адрессацией.

### 404 перезапись

Как очень быстрое и простое решение можно вместо mod_rewrite использовать перенаправление 404 ошибки

`ErrorDocument 404 /index.php`

Теперь достаточно в index.php обратится к массиву и вызвать нужный модуль:

```php
header("HTTP/1.1 200 OK");  
header("Status: 200 OK");  
  
$arrURL=explode('/',$_SERVER['REQUEST_URI']);
```

Не забудьте проверять существует ли такой модуль в системе, и сделать обработку ошибок, в том числе и на уровне header-ов, иначе поисковики могут посчитать что у вас всюду брак.

## Related

- [Basic auth с помошью .htaccess](/ru/blog/tech/server/basic-auth-s-pomoshyu-htaccess/)
- [Crontab](/ru/blog/tech/server/crontab/)
- [Crontab](/ru/blog/tech/server/vagrant/)
