Написание htaccess (ЧПУ + редирект со старых адресов)

[Удален]
7479

Дали задачу: сделать ЧПУ и сделать редирект со старых адресов на новые(чпу).

С рекурсией вроде разобрался. Основная проблема стала с редиректом с динамических страниц.

Долго мучался, читал, искал... вот к чему пришел:

1.RewriteEngine on

2.#создание из страницы вида www.site.ru/productions.php?view=category&id=1 страницы вида www.site.ru/category/1/

3.RewriteRule ^category/([0-9]+)/$ /productions.php?view=category&id=$1&norec [L]

4.#редирект, если перейти по ссылке www.site.ru/productions.php?view=category&id=1 - на созданную (чпу) www.site.ru/category/1/

5.RewriteCond %{QUERY_STRING} view=category&id=1$

6.RewriteRule ^productions.php$ /category/1/? [L,R=301]

Соответственно несколько вопросов:

1. Чтобы не было рекурсии, добавил в строке 3. переменную &norec.

Правильно ли это или это можно сделать по-другому, если можно то как?

2. 5-ая и 6-ая строка, отвечающие за редирект со старых адресов написана для одной страницы, где id=1? как переписать данный код, чтобы работала по шаблону, т.е. id=1 -> category/1/ , id=2 -> category/2/ и т.д.

3. Пробовал делать переадресацию с динамической страницы так:

RewriteRule ^productions\.php\?view=category&id=1$ /category/1/ [L,R=301]

но переадресация не происходит, такое ощущение что экранирование знака ? не работает.

Можно ли сделать переадресацию таким образом, если да, то как?

Прошу также указать на имеющиеся ошибки при написании мною htaccess.

[Удален]
#1
Andreone:
1. Чтобы не было рекурсии, добавил в строке 3. переменную &norec.
Правильно ли это или это можно сделать по-другому, если можно то как?

Рекурсии быть не должно и без norec


2. 5-ая и 6-ая строка, отвечающие за редирект со старых адресов написана для одной страницы, где id=1? как переписать данный код, чтобы работала по шаблону, т.е. id=1 -> category/1/ , id=2 -> category/2/ и т.д.


RewriteCond %{QUERY_STRING} view=category&id=(\d+)$
RewriteRule ^productions.php$ /category/%1/? [L,R=301]

3. Пробовал делать переадресацию с динамической страницы так:
RewriteRule ^productions\.php\?view=category&id=1$ /category/1/ [L,R=301]
но переадресация не происходит, такое ощущение что экранирование знака ? не работает.
Можно ли сделать переадресацию таким образом, если да, то как?

Знак вопроса не экранируется.

Ваш способ с QUERY_STRING единственно верный.

[Удален]
#2

1.RewriteCond %{QUERY_STRING} view=category&id=(\d+)$

2.RewriteRule ^productions.php$ /category/%1/? [L,R=301]

что такое (\d+) в строке 1? Пробовал, так не сработало.

что делает знак "?" в конце 2-ой строки?

попробовал так:

1.RewriteCond %{QUERY_STRING} view=category&id=([0-9]+)$

2.RewriteRule ^productions.php$ /category/%1/? [L,R=301]

Работает.

%1, как я понял - это переменная из строки RewriteCond (по аналогии с $1)

Ну с этим вроде разобрался. Спасибо огромное.

Рекурсия без &norec - есть. Ниже пишу рабочий код преобразования.

Если бы кто-то подсказал как с рекурсией по-другому разобраться, был бы очень признателен.

---код---

1. RewriteEngine on

2.RewriteRule ^category/([0-9]+)/$ /productions.php?view=category&id=$1&norec [L]

3.RewriteCond %{QUERY_STRING} view=category&id=([0-9]+)$

4.RewriteRule ^productions.php$ /category/%1/? [L,R=301]

И еще вопрос:

правильно ли я понимаю: после преобразования url соответствующего шаблону все правила запускаются с первого зановно?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий