За последние 24 часа нас посетили 22326 программистов и 1025 роботов. Сейчас ищут 687 программистов ...

редирект с (.htaccess | header) c входящими GET параметрами

Тема в разделе "Настройка веб-сервера", создана пользователем Vad0k, 6 авг 2016.

  1. Vad0k

    Vad0k Активный пользователь

    С нами с:
    17 ноя 2014
    Сообщения:
    23
    Симпатии:
    0
    Добрый день форумчане.
    Можете пожалуйста помочь с написанием(регулярного выражения) участвующие в редиректе.
    У меня есть самописный сайт http://example.com/ (он мультиязычный (2 языка)). Столкнулся с такой проблемой:
    Мне необходимо сделать постоянный(301) редирект с таких страниц на такие:
    Код (Text):
    1. http://www.example.com ---> http://example.com/index.php?lang=EN (по умолчанию)
    2. http://www.example.com/ ---> http://example.com/index.php?lang=EN (по умолчанию)
    3.  
    4. http://example.com ---> http://example.com/index.php?lang=EN (по умолчанию)
    5. http://example.com/ ---> http://example.com/index.php?lang=EN (по умолчанию)
    6.  
    7. http://example.com/?lang=EN ---> http://example.com/index.php?lang=EN
    8. http://www.example.com/?lang=EN ---> http://example.com/index.php?lang=EN
    9. //(EN - здесь может быть и RU и UA и др.)

    Хотелось бы это провернуть в httacess. Знаю, можно просто достать всё необходимое(ссылку) из суперглобального массива $_SERVER, распарсить её, проверить и делать редирект через header, но считаю правильным сделать через htaccess.
    Я вроде понимаю базово регулярки, но черт никогда с ними не практиковал.
    ps: Хотел добавить в раздел SEO тему, но не нашел.
     
    #1 Vad0k, 6 авг 2016
    Последнее редактирование модератором: 6 авг 2016
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    похерил ссылки ибо нефиг.
    ты либо не правильно хочешь, либо это и без рерайтера решается.

    первые две строки - отличаются трейлинг-слэшем между собой и субдоменом тридаблъю между парой три-четыре. это решается стандартными средствами апачи БЕЗ рерайтера. в мануале по рерайтеру есть отдельная статья на эту тему.

    следующие две строчи - третья-четвертая. их веб-серверу будет резолвить в корневой каталог и далее искать индекс этого каталога. если это будет индекс-пхп то туда запрос и свалится. а далее внутри ты проверяешь установлена ли явно переменная языка (ключ ланг суперглобмассива гет) и ставишь её при необходимости в енг.

    пятая-шестая. появился явный ключ языка. шестая строка как первая-вторая уходит. пятая строка тоже не редирект потому что как третья-четвертая резолв и так уйдет к индексу.
     
  3. Vad0k

    Vad0k Активный пользователь

    С нами с:
    17 ноя 2014
    Сообщения:
    23
    Симпатии:
    0
    Я лично не против, главное как образец был.
    Я хочу явно отдать ответ (заголовок 301) при переходе по этим ссылка.
    Хм... на сервере нету доступа к php.ini (хотя вроде можно менять некие конфигурации через htaccess). Но статью Я поищу.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    понял тебя.
    Код (Text):
    1. RewriteEngine On
    2. RewriteBase /
    3.  
    4. RewriteCond "%{QUERY_STRING}" !(^|&)lang=..(&|$)
    5. RewriteRule .* index.php?lang=en [R=301,L]
    6.  
    7. RewriteCond "%{QUERY_STRING}" (^|&)lang=(..)(&|$)
    8. RewriteCond "%2" !^(en|ru|ua)$
    9. RewriteRule .* index.php?lang=en [R=301,L]
    Первая пара строк включает рерайтер и задает базовый обслуживаемый урл.
    Вторая пара строк проверяет наличие ланга в аргументах и если его нет - редиректит на индекс с лангом.
    Третья пара чисто поржать - если не английский-русский-украинский, то редирект на индекс с английским лангом.

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

    а пхп-ини тут при чем? Я про конфигурацию веб-сервера говорил. Апачи настраивается не через пхп-ини.
    её никто не прятал. Она в документации по веб-серверу в целом и разделе рерайтера в частности.

    Тему уношу в настройки веб-сервера, так как верховное божество рерайта (эт я, приятно познакомиться! Санитары рядом?) решает подобные вопросы там.
     
    Vad0k нравится это.
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Мягко говоря ты написал полную хрень. Давай поясню.
    вот тут ты сравниваешь хост со значением www.example.ru, потом со значением www.example.ru/ - ТРЕЙЛИНГ СЛЭША НЕ МОЖЕТ БЫТЬ В ДОМЕННОМ ИМЕНИ -, потом с example.ru и example.ru/ - тут опять слэш вылез. И делаешь с этого всего редирект на индекс с указанием языка. Следуя логике вообще любого адекватного существа в этой вселенной - ты создал бесконечный редирект. Запрос пришел на ввв-чо-то-там? Да! Первое правило! Редирект с лангом. Ок. Запрос пришел на чо-то-там-без-ввв? ДА! ТРЕТЬЕ ПРАВИЛО. Редирект на без-ввв с лангом. Ок. Запрос пришел на чо-то-там-без-ввв? ДА! ТРЕТЬЕ ПРАВИЛО. И так далее.

    Тут ты опять сравниваешь хост с недопустимыми значениями. Ну не может быть в хосте ни слэша, ни вопроса. Ну да хрен с ним. Допустим в каком-то мифическом мире у хоста будут эти значения и только ради того чтоб мы могли почитать какие же проверки ты сюда нафаршировал. И первая и вторая строчки оканчиваются так: заканчивается двумя заглавными буквами даблъю в любом регистре. Как ты собрался EN с этим сравнивать? EN никогда в жизни не будет равно WW. Третья строка - (ого!) исключаешь обращения к робот-ресурсам. Нот бэд. Четвёртая строка: совершить редирект с ресурса имя которого содержит две заглавные даблъю на вообще не важно куда. Тут главное именно откуда.

    Вот. Лайкай :D
    --- Добавлено ---
    Автор попросил убрать его полную хрень, потому что не обновлял страницы и не видел решения. Его хрень я покорно удаляю, однако оставляю свой линч на его хрень. Не зря ж я клавиатуру насиловал в конце концов :cool:
     
    Vad0k нравится это.