.htaccess: 301 редирект php-страниц с параметрами.

Февраль 2, 2012 at 16:22 14 комментариев

Я не он, я только учусь) Из-за нужд seo пришлось делать этот самый безопасный для них redirect.
В Интернете много примеров, как пользоваться .htaccess, в частности есть отличная статья на хабре про его дао: тут.
Но там в основном рассматриваются варианты перенаправления статических html-страниц или классический случай домена с www и без него.
А что делать, если возникла странная задача: сделать редирект страницы http://www.example.ru/index.php?id=16 на http://www.example.ru/index.php?id=17 ?
Простой редирект(без RewriteEngine) не даст ничего или сайт упадет с ошибкой 500.
Сделать, как со статическими страницами: RewriteRule index.php?id=16 на /index.php?id=17 [R=301,L] тоже ничегошеньки не даст. Только сайт тут не упадет, что в принципе бонус.
Все дело в том, что в исходной строке есть параметры (все, что после знака вопроса).
Поэтому делаем так:

RewriteCond %{QUERY_STRING} ^id=16$
RewriteRule ^index.php /index.php?id=17 [L,R=301]

По сути это означает следующее: если в URL есть подстрока параметров id=16, то подставить /index.php?id=17, вместо того, что сейчас обрабатывается (а это все то же URL. RuleEngine параметры не смотрит, и URL для него просто строка — абсолютный путь до файла, содержащего страницу. Так что где .htaccess — там и «корень» URL. Кроме того, apache будет крутить эту строку столько раз через правила .htaccess, пока она не перестанет меняться.). enjoy!

Реклама

Entry filed under: Uncategorized. Tags: , , , .

postfix+dovecot: virtual alias php: string contains substring

14 комментариев Add your own

  • 1. Гриша  |  Апрель 24, 2012 в 18:20

    А если нужно не просто 16 на 17 перебить, а скажем, со всех страниц news.php?id=N, сделать редирект на news/N/ ?

    Ответить
    • 2. kakabba  |  Апрель 24, 2012 в 20:54

      N — это изменяющийся номер? буду исходить из этого.
      я не могу сейчас попробовать, но надо воспользоваться регулярными выражениями.
      в RewriteCond соответственно вместо 16 надо использовать диапазон [0-9]+. это означает одна и более цифр подряд.
      а в RewriteRule ^news/([0-9]+)/?$ news.php?id=$1 [L,R=301]
      Вроде бы так..отпишитесь, так или нет?

      Ответить
      • 3. Гриша  |  Апрель 24, 2012 в 21:26

        Вообще пытаюсь сделать ЧПУ + на старых страницах сделать редирект 301.

        Для себя пока решение не нашел. Нашел две составляющие:
        1. Так можно сделать редирект с news.php?id=N на news/N.html

        RewriteCond %{REQUEST_URI} news.php$
        RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
        RewriteRule (.*) http://autosalon13.ru/news/%1.html? [R=301,nc,L]

        news/N.html естественно не существует и выдает 404.

        2. Чтобы news/N.html не выдавал 404 можно сделать так:

        RewriteRule ^news\/([0-9]+)\.html$ /news.php?id=$1 [nc]

        Но если оба пункта присутствуют в htaccess, то происходит зацикливание. Вот как бы ухитриться и ЧПУ на сайте прикрутить и со старых адресов 301 редирект применить? 3 дня бьюсь безуспешно

      • 4. kakabba  |  Апрель 25, 2012 в 14:54

        Я немного запуталась в том, какая цель редиректа. Есть адреса типа news.php?id=N. Надо чтобы по этому запросу выдавались страницы с адресом news/N/.. а дальше что?

      • 5. Гриша  |  Апрель 25, 2012 в 15:41

        В общем сейчас на сайте news.php?id=N, нужно сделать чтобы было news/N/ . Если просто так сделать и поменять везде ссылки на чпу-шные, то сайт будет открываться как по старому url, так и по-новому. Нужно, чтобы сайт открывался только по новому типу url, а при обращении по старому типу редиректился на новый тип. Как-то так

  • 6. kakabba  |  Апрель 25, 2012 в 16:03

    Эээм. Зачем тогда в Вашем RewriteRule (.*) http://autosalon13.ru/news/%1.html? [R=301,nc,L] есть html?
    Тогда уж RewriteRule (.*) http://autosalon13.ru/news/%1/? [R=301,nc,L]
    И зачем второе правило RewriteRule ^news\/([0-9]+)\.html$ /news.php?id=$1 [nc]? оно же обратно меняет только что обработанный URL на прежний. и правда будет бесконечный цикл. Ведь 301 редирект означает, что страницы по новому адресу уже размещены, но ссылки в остальном мире указывают на старое размещение. Как раз по старым адресам должно бы выдаваться 404, но там апач должен подставить новый адрес.

    Ответить
  • 7. Гриша  |  Апрель 25, 2012 в 19:13

    да в принципе не суть важно /news/N.html или /news/N/
    Проблема в том, что применяя систему ЧПУ, сайт продолжает открываться и по news.php?id=N и по новой ЧПУ ссылке /news/N.html. Т.е. грубо говоря пользователи сайта успешно юзают новые урлы, а роботы поисковиков заглядывают на старые урлы вида news.php?id=N, что не сулит ничего хорошего с точки зрения сохранения позиций в поисковой выдаче. Вот я и хочу, чтобы при заходе на news.php?id=N, редиректило на /news/N.html . Возможно, конечно, что решение лежит на поверхности, но глаз в результате долгого ковыряния и чтения мануалов, глаз замылен настолько, что я просто опускаю руки. Да и с htaccess я до этого момента сталкивался только для deny from и редиректа статичных страниц.

    Ответить
  • 8. kakabba  |  Апрель 25, 2012 в 19:39

    я начинаю вспоминать, в чем вообще суть была проблемы и почему я решила, что это вообще стоит статьи. дело в том, что в условии RewriteCond исходное URL можно рассматривать полностью, то есть с параметрами. а вот в RewriteRule — только до знака вопроса. Поэтому у меня в примере в нем просто index.php. Хотя вроде бы должно быть index.php?id=16. Соответственно есть смутное подозрение, что N оттуда вообще не вытащить. Но а вдруг?
    RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
    RewriteRule ^news.php /news/%1 [L,R=301]

    Ответить
    • 9. Гриша  |  Апрель 30, 2012 в 23:33

      Вот думаю, может как через ИЛИ (OR) с несколькими RewriteCond эту задачу решить?

      Ответить
      • 10. kakabba  |  Май 3, 2012 в 11:50

        ну явно можно сделать N штук RewriteCond и N правил. только если N велико, то будет печально.

  • 11. Галина  |  Май 4, 2012 в 16:20

    Как сделать правильно перенаправление, если используются параметры, например

    RewriteEngine On
    RewriteCond %{QUERY_STRING} ^ELEMENT_ID=4383$
    RewriteRule /trained/articles\.php$ /it/informacia/nod/? [L,R=301]
    Redirect 301 /trained/articles.php /it/informacia/

    в итоге должен получиться http://mysait.ru/it/informacia/, а в результате получается http://mysait.ru/it/informacia/nod/ELEMENT_ID=4383 он выдирает этот id и прикрепляет его к новой ссылке, как это исправить?

    Ответить
  • 12. Илья  |  Февраль 14, 2013 в 08:27

    Заранее извиняюсь за такое полотно. Но очень нужна помощь. Стоит задача сделать редиректы с бывших страниц старого сайта — сейчас его не существует. Страницы были с параметрами и очень мудреными.

    Собственно проблема:
    Редирект с:
    /index.php?option=com_content&view=article&id=553
    на:
    /news/market/1628/

    Что нужно прописать?

    Текущий htaccess:

    Action php-script /cgi-bin/php-cgi5
    AddHandler php-script .php

    RewriteCond %{HTTP_HOST} ^www.example.ru$
    RewriteRule (.*) http://example.ru/$1 [R=301,L]
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
    RewriteRule ^index\.html$ http://example.ru/ [R=301,L]
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    RewriteRule ^index\.php$ http://example.ru/ [R=301,L]

    Options -Indexes
    ErrorDocument 404 /404.php

    php_flag allow_call_time_pass_reference 1
    php_flag session.use_trans_sid off

    #php_value display_errors 1

    #php_value mbstring.func_overload 2
    #php_value mbstring.internal_encoding UTF-8

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
    RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
    RewriteRule .* — [E=REMOTE_USER:%{HTTP:Authorization}]

    DirectoryIndex index.php index.html

    ExpiresActive on
    ExpiresByType image/jpeg «access plus 3 day»
    ExpiresByType image/gif «access plus 3 day»

    Ответить
  • 13. abs  |  Июнь 23, 2013 в 23:31

    Универсальное решение и избавление от всяких бяк в конце:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{QUERY_STRING} ELEMENT_ID=([^&]*)$
    RewriteRule ^articles.php it/informacia/nod%1/? [L,R=301]
    RewriteRule ^it/informacia/nod(\d+)/$ /my-directory/articles.php?ELEMENT_ID=$1 [L]

    Ответить
  • 14. Богдан  |  Март 10, 2014 в 20:28

    Помогите нубу!Я не понялэто все в htacess писать?
    И если да то как?Например я хочу редира на examp.le/news.html
    что писать?Хочу чтобы например было вот так:
    examp.le/index.php?pid=369?

    Ответить

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed



%d такие блоггеры, как: