За последние 24 часа нас посетил 35071 программист и 1737 роботов. Сейчас ищут 810 программистов ...

htaccess

Тема в разделе "PHP для новичков", создана пользователем rs_ssh, 6 дек 2016.

  1. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Такое правило срабатывает для model.php?id=1
    RewriteRule^bmw$ /model.php?id=1 [L]

    Подскажите универсальное правило чтобы подставить любую страну для model.php?country=2(может быть любое число)&id=1
    RewriteRule^ЛЮБАЯ_СТРАНА/bmw$ /model.php?country=2&id=1 [L]
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Мне известно одно универсальное правило и базируется оно на концепции "единой точки входа".
    Код (Text):
    1. RewriteEngine on
    2. RewriteCond %{REQUEST_FILENAME} !-f
    3. RewriteCond %{REQUEST_FILENAME} !-d
    4. RewriteRule . index.php
    Последняя строка имеет различные вариации, но суть одна - все запросы перенаправляются на index.php
     
    mahmuzar и denis01 нравится это.
  3. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Как сделать для такого единое правило - model.php?country=1&id=1(ЧПУ- /germany/category), model.php?country=2&id=1(/italy/category), model.php?country=3&id=1(/france/category) и т.д.
     
  4. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Всё ещё актуально :)
     
  5. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Такое лучше разруливать на стороне PHP.

    Средствами mod_rewrite это решается с помощью RewriteMap, но эта штука доступна только в контексте server config, virtual host.
    Если это обычный шаред хостинг и нет доступа к настройкам virtual host, то как-то так:
    Код (Text):
    1.  
    2. RewriteCond "$1  germany=1 italy=2 france=3"  "^(\S+) .*? \1=(\d+)"
    3. RewriteRule ^([^/]+)/category$ model.php?country=%2&id=1 [L]
     
  6. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    А как можно сделать такое единое правило для model.php?country=1&id=14(ЧПУ- /germany/category14), model.php?country=2&id=22(/italy/category22), model.php?country=3&id=13(/france/category13) и т.д.

    Т.е в category может быть любое название категории так же как в country может быть любая страна.
     
  7. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Всё ещё актуально :)
     
  8. marsik

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

    С нами с:
    30 дек 2008
    Сообщения:
    246
    Симпатии:
    17
    упрощенно типа так
    PHP:
    1. RewriteRule ^(.*)/(.*)$ model.php?country=$1&id=$2
    А так гуглите по ключу rewrite rule
     
    #8 marsik, 1 фев 2017
    Последнее редактирование модератором: 1 фев 2017
  9. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Можете подправить?

    PHP:
    1. RewriteCond "$1  germany=1 italy=2 france=3"  "^(\S+) .*? \1=(\d+)"
    2. RewriteCond "$2  napitki=1 eda=2 odezhda=3"  "^(\S+) .*? \1=(\d+)"
    3. RewriteRule ^([^/]+)/([^/]+)$ cat.php?country=%1&id=%2 [L]
    Должно получаться:
    /germany/napitki
    /italy/odezhda
    /france/eda
    /france/odezhda
    /italy/napitki
    и т.д.
     
  10. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Код (Text):
    1.  
    2. RewriteCond "$1  germany=1 italy=2 france=3"  "^(\S+) .*? \1=(\d+)"
    3. RewriteCond "%2 $2  napitki=1 eda=2 odezhda=3"  "^(\S+) (\S+) .*? \2=(\d+)"
    4. RewriteRule ^([^/]+)/([^/]+)$ cat.php?country=%1&id=%3 [L]
     
    rs_ssh нравится это.
  11. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Спасибо!
     
  12. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Подскажите как добавить третье условие?
    RewriteCond "%3 $3 sok=101 voda=102 limonad=103" "^(\S+) (\S+) (\S+) .*? \3=(\d+)"
    PHP:
    1. RewriteCond "$1  germany=1 italy=2 france=3"  "^(\S+) .*? \1=(\d+)"
    2. RewriteCond "%2 $2  napitki=1 eda=2 odezhda=3"  "^(\S+) (\S+) .*? \2=(\d+)"
    3. RewriteCond "%3 $3  sok=101 voda=102 limonad=103"  "^(\S+) (\S+) (\S+) .*? \3=(\d+)"
    4. RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ cat.php?country=%1&id=%3&id2=%5 [L]
     
    #12 rs_ssh, 13 фев 2017
    Последнее редактирование: 13 фев 2017
  13. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Да сделай ты уже рерайт всех урлов на пхп-машину и в ней обрабатывай адрес как душе угодно.
     
    denis01 нравится это.
  14. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    А можно конкретный пример как сделать рерайт этого примера:
    PHP:
    1. RewriteCond "$1  germany=1 italy=2 france=3"  "^(\S+) .*? \1=(\d+)"
    2. RewriteCond "%2 $2  napitki=1 eda=2 odezhda=3"  "^(\S+) (\S+) .*? \2=(\d+)"
    3. RewriteCond "%3 $3  sok=101 voda=102 limonad=103"  "^(\S+) (\S+) (\S+) .*? \3=(\d+)"
    4. RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ cat.php?country=%1&id=%3&id2=%5 [L]
     
  15. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @rs_ssh @Deonis уже выложил универсальное решение по рерайту всего и вся на пхп-машину.
     
  16. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    PHP:
    1. RewriteEngine on
    2. RewriteCond %{REQUEST_FILENAME} !-f
    3. RewriteCond %{REQUEST_FILENAME} !-d
    4. RewriteRule . model.php
    Ну так можно отобразить любой ЧПУ адрес.

    Собственно как быть с переменными?
    Как отображать страницы которые есть?
    /germany/napitki
    /italy/odezhda
    /france/eda
    /france/odezhda
    /italy/napitki

    И как отображать NOT FOUND для тех страниц которых не должно быть?
     
  17. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Именно. Роутингом будет твой пхп-скрипт заниматься. Он о твоих странах и жрачках знает больше чем веб-сервер.

    С какими? С аргументами гет-запроса? Они будут прилеплены при рерайте и попадут в пхп-машину

    Это уже к тебе вопрос. Взял адрес, как-то обработал, где-то поискал, что-то показал.

    header('http/1.0 404 Not found'); + текст печальной страницы + exit; И всё.
     
  18. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    А как сделать чтобы ошибка 404 выводилась при любом написании, например как здесь - https://php.ru/test , где test несуществующая страница(может быть и test2 и test3), и нету никакого редиректа на not_found.php или 404.html.
    Всё отображается на несуществующей странице!
    Как я понимаю это хорошо для SEO? Как это можно реализовать?
     
    #18 rs_ssh, 18 фев 2017
    Последнее редактирование: 18 фев 2017
  19. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
     
  20. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Скажем есть такой вот ЧПУ адрес - site.ru/italy/napitki, как php узнает что italy это $country=2, а napitki это $id=1 ???
    Или же надо делать условие если $_SERVER['PHP_SELF'] = /italy/napitki создавай переменные $country=2 и $id=1 ???
     
  21. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    regex, регулярные выражения, можно и простым explode обойтись, но с regex больше возможности по распознаванию правильной структуры,
    в базе или ещё где храни соответствия napitki = 1 и т.д.
     
  22. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    И не совсем понятно с ошибкой 404
    Это правило перестаёт работать:

    PHP:
    1. ErrorDocument404 /404
    2. ErrorDocument 403 /404
    3.  
    4. RewriteRule^404$ /?404 [L]
    Когда начинаем использовать правило единой точки входа:

    PHP:
    1. RewriteEngine on
    2. RewriteCond %{REQUEST_FILENAME} !-f
    3. RewriteCond %{REQUEST_FILENAME} !-d
    4. RewriteRule . model.php
    В model.php делаем проверку на запрашиваемую несуществующую страницу(для теста):
    PHP:
    1. if($_SERVER['REQUEST_URI'] == "/test")
    2. {
    3.     header('http/1.0 404 Not found');
    4.     exit ();
    5. }
    Да, так получаем стандартную страницу от Chrome с HTTP/1.1 404 Not Found, которая так же правильно возвращает код ошибки 404 , но у меня была уже своя настроенная 404 страница с этими правилами:
    PHP:
    1. ErrorDocument404 /404
    2. ErrorDocument 403 /404
    3.  
    4. RewriteRule^404$ /?404 [L]
    которая срабатывала всегда когда страница не найдена, так что не знаю как этим header('http/1.0 404 Not found'); настроить так же как было.
     
    #22 rs_ssh, 23 фев 2017
    Последнее редактирование: 23 фев 2017
  23. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Вот так показывает настроенную 404 страницу(по адресу site.ru/test):
    PHP:
    1. if ($_SERVER['REQUEST_URI'] == "/test")
    2. {
    3.     header("HTTP/1.1 404 Not Found");
    4.     include('404.php');
    5.     exit();
    6. }
    Собственно как её показывать на все несуществующие страницы???
     
  24. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Обрабатываешь все существующие страницы, например у тебя массив с правилами и если правила закончились и не одно не подошло, то значит время показывать 404