Форум программистов, компьютерный форум, киберфорум
Наши страницы
Интернет-маркетинг, SEO
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
otixshopo
Регистрация: 14.01.2009
Сообщений: 136
1

Как правильно настроить ЧПУ-адреса в .htaccess?

20.03.2010, 14:28. Просмотров 7215. Ответов 8
Метки нет (Все метки)

Добрый день! Мой самописный движок работает с однотипными страничками с параметрами page.php?model=n. Я хочу ЧПУ. И пишу в .htaccess строки

RewriteRule usluga/nazvanie_proekta1.php page.php?model=1.
и т.д.

В результате, я переделал внутренние ссылки на ссылки вида usluga/nazvanie_proekta1.php и страницы ЧПУ грузятся корректно. Но в индексе сидят старенькие вида page.php?model=n.
Как в строку RewriteRule usluga/nazvanie_proekta1.php page.php?model=1 прикрутить 301-редирект, чтобы в индекс вошли ЧПУ-адреса?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2010, 14:28
Ответы с готовыми решениями:

Как правильно сделать ЧПУ
Посоветуйте, пожалуйста, как правильнее сделать ЧПУ, чтоб посковикам нравилось возможны...

Wordpress, адреса страниц, ЧПУ
Вообщем сделал статичный (не блог) сайт на wordpress. Сглупил в самом начале (мало спал и туплю...

Как правильно настроить рекламные блоки Яндекса?
Здравствуйте, помогите новичку разобраться с настройками рекламных блоков Яндекса для России....

Адреса страниц ЧПУ на латыне или Кириллице?
Попался мне новый сайт с CMS на которой можно прописывать кириллические урлы, до этого всегда...

Htaccess, как правильно настроить редирект?
Здравствуйте, подскажите как правильно настроить .htaccess Имеется такая иерархия, themes...

8
DiZimdim
Регистрация: 15.03.2010
Сообщений: 35
21.03.2010, 15:16 2
Привет. Если так попробывать RewriteRule ^page.php?model=1$ /usluga/nazvanie_proekta1.php [L,R=301]
0
otixshopo
Регистрация: 14.01.2009
Сообщений: 136
21.03.2010, 15:30  [ТС] 3
Привет. Если так попробывать RewriteRule ^page.php?model=1$ /usluga/nazvanie_proekta1.php [L,R=301]
А можно ссылочку на источник для изучения? Мне кажется это просто 301 редирект, а в моем случае необходимо другое: файлов /usluga/nazvanie_proekta1.php физически не существует - это просто красивые адреса старых страниц.
0
cremmi
Регистрация: 13.03.2006
Сообщений: 959
21.03.2010, 15:45 4
ЧПУ уже сделаны, остается перенаправить со старых динамических URL на новые?

Тогда просто лезьте в код движка, делайте проверку исходного запроса, он лежит в $_SERVER['REQUEST_URI']. Проверяйте формат запроса и если там "page.php?model=", то перенаправляйте функцией header().

<div>Код</div><div>header($_SERVER['SERVER_PROTOCOL']. ' 301 Moved Permanently');
header('Location: http://domain.com'.$static_uri);
exit;</div>
В $static_uri засовываете тот статический URI, который нужен.

Дело в том, что средствами mod_rewrite вы не сделаете маску для динамического URI с параметрами.
0
21.03.2010, 15:45
otixshopo
Регистрация: 14.01.2009
Сообщений: 136
21.03.2010, 15:59  [ТС] 5
ЧПУ уже сделаны, остается перенаправить со старых динамических URL на новые?

Тогда просто лезьте в код движка, делайте проверку исходного запроса, он лежит в $_SERVER['REQUEST_URI']. Проверяйте формат запроса и если там "page.php?model=", то перенаправляйте функцией header().

<div>Код</div><div>header($_SERVER['SERVER_PROTOCOL']. ' 301 Moved Permanently');
header('Location: http://domain.com'.$static_uri);
exit;</div>
В $static_uri засовываете тот статический URI, который нужен.

Дело в том, что средствами mod_rewrite вы не сделаете маску для динамического URI с параметрами.
А скажите, почему нельзя писать Redirect 301 /old/old.htm http://www.you.com/new.htm такие конструкции в файле .htaccess?
0
cremmi
Регистрация: 13.03.2006
Сообщений: 959
21.03.2010, 16:13 6
А скажите, почему нельзя писать Redirect 301 /old/old.htm http://www.you.com/new.htm такие конструкции в файле .htaccess?
Никто не говорит, что нельзя. Можно.
А теперь "но". :)

1. mod_rewrite работает повсеместно, но эта директива не его. Сначала проверьте, подключен ли на хостинге модуль mod_alias. Это его директива.

2. Директива Redirect единичная. На каждый перенаправляемый URL по строчке? Не интересно. Используйте RedirectMatch - хоть какая-то поддержка регулярных выражений.
0
otixshopo
Регистрация: 14.01.2009
Сообщений: 136
23.03.2010, 16:27  [ТС] 7
Никто не говорит, что нельзя. Можно.
А теперь "но". :)

1. mod_rewrite работает повсеместно, но эта директива не его. Сначала проверьте, подключен ли на хостинге модуль mod_alias. Это его директива.

2. Директива Redirect единичная. На каждый перенаправляемый URL по строчке? Не интересно. Используйте RedirectMatch - хоть какая-то поддержка регулярных выражений.
Спасибо за подробный и развернутый ответ. С вами согласен. Решение не гибкое, но с учетом не очень большого количества страниц сайта, того что подключен mod_alias и того, что я не умею пользоваться RedirectMatch попробую реализовать данный не очень рациональный вариант.

Скажите пожалуйста корректна ли такая запись в файл?

RewriteRule usluga/nazvanie_proekta1.php page.php?model=1
RewriteRule usluga/nazvanie_proekta2.php page.php?model=2
RewriteRule usluga/nazvanie_proekta3.php page.php?model=3
...
Redirect 301 page.php?model=1 http://www.you.com/usluga/nazvanie_proekta1.php
Redirect 301 page.php?model=2 http://www.you.com/usluga/nazvanie_proekta2.php
Redirect 301 page.php?model=3 http://www.you.com/usluga/nazvanie_proekta3.php
...
0
cremmi
Регистрация: 13.03.2006
Сообщений: 959
24.03.2010, 16:41 8
Я тут немножко проверил то, с чем до сих пор не играл... :)
Не пользуюсь услугами mod_alias, поскольку mod_rewrite есть всюду, и возможности у него на порядки больше. Но то, что не умеет mod_rewrite, точно так же не умеет и mod_alias – принимать в маске ссылки с параметрами.
Так что вторая часть вашей прописи работать не будет, можете не сомневаться, проверено. Придется все-таки лезть в скрипт page.php и делать проверку переменной окружения REQUEST_URI. И если в ней есть параметры, разбирать их и посылать заголовки так, как я написал выше.

Теперь о первой части. Модуль mod_rewrite работает с регулярными выражениями. Использовать его так совершенно нерационально. А когда у вас появится модель 4, будете дописывать еще строчку под нее? :) И далее вплоть до модели 9999? Это первое.
Второе - <b>никогда</b> не используйте правила трансляции URL без условий. Я о проверке существования файлов. Те, кто нарушает это правило, потом удивляются, почему это некоторые URLы вечно недоступны. И не могут подтвердить права на сайт в панели Яндекса и инструментах Гугла.

Строим правила так:
<div>Код</div><div>RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^usluga\/nazvanie_proekta([0-9]+)\.php$ page.php?model=$1 [L]</div>

RewriteCond задает условие:
если переменная окружения REQUEST_FILENAME (имя запрошенного файла) <b>не</b> является именем реально существующего файла, тогда будет выполнено правило преобразования.
Если такой файл есть, то никаких преобразований не будет.

RewriteRule можно расшифровать так:
- вместо запроса, который начинается с "usluga/nazvanie_proekta", затем стоит один или более цифровых символов (их запомнить, это будет паттерн1), а заканчивается ".php"
- подставить запрос "page.php?model=" и к нему приписать паттерн1
- на этом преобразование завершить - [L]

Вот с такими правилами можете потом добавлять model хоть до 9999999999 - исправно получите обработку запроса usluga/nazvanie_proekta9999999999.php
0
otixshopo
Регистрация: 14.01.2009
Сообщений: 136
24.03.2010, 16:55  [ТС] 9
Модуль mod_rewrite работает с регулярными выражениями. Использовать его так совершенно нерационально. А когда у вас появится модель 4, будете дописывать еще строчку под нее? :) И далее вплоть до модели 9999?

Спасибо за очередной развернутый ответ, но использовать регулярные выражения во второй части, наверное, увы, не выйдет, т.к. nazvanie_proekta у всех проектов разные, например, videorolik/stroitelstvo_vozdushnogo_metro.php или presentation/rekonstructia_porta_v_kaliningrade.php и т.д. (примеры вымышленные, конечно). А в остальном - будем работать и брать материал с Вашего сайта :)
0
24.03.2010, 16:55
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2010, 16:55

Как создать правило для ЧПУ в .htaccess
Вообщем адрес такой categories.php?name=fantastika&amp;id=3&amp;page=2 а надо...

Как из адреса ЧПУ убрать символьный код раздела?
Добрый день! Использую компонент bitrix:news. Сейчас ссылки формируются таким образом:...

Как настроить ЧПУ на Nginx?
Всем привет. Вопрос к ребятам, хорошо разбирающимся в настройках VPS. У меня VPS на Digital...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru