Такое правило срабатывает для 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]
Мне известно одно универсальное правило и базируется оно на концепции "единой точки входа". Код (Text): RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php Последняя строка имеет различные вариации, но суть одна - все запросы перенаправляются на index.php
Как сделать для такого единое правило - model.php?country=1&id=1(ЧПУ- /germany/category), model.php?country=2&id=1(/italy/category), model.php?country=3&id=1(/france/category) и т.д.
Такое лучше разруливать на стороне PHP. Средствами mod_rewrite это решается с помощью RewriteMap, но эта штука доступна только в контексте server config, virtual host. Если это обычный шаред хостинг и нет доступа к настройкам virtual host, то как-то так: Код (Text): RewriteCond "$1 germany=1 italy=2 france=3" "^(\S+) .*? \1=(\d+)" RewriteRule ^([^/]+)/category$ model.php?country=%2&id=1 [L]
А как можно сделать такое единое правило для 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 может быть любая страна.
упрощенно типа так PHP: RewriteRule ^(.*)/(.*)$ model.php?country=$1&id=$2 А так гуглите по ключу rewrite rule
Можете подправить? PHP: RewriteCond "$1 germany=1 italy=2 france=3" "^(\S+) .*? \1=(\d+)" RewriteCond "$2 napitki=1 eda=2 odezhda=3" "^(\S+) .*? \1=(\d+)" RewriteRule ^([^/]+)/([^/]+)$ cat.php?country=%1&id=%2 [L] Должно получаться: /germany/napitki /italy/odezhda /france/eda /france/odezhda /italy/napitki и т.д.
Код (Text): RewriteCond "$1 germany=1 italy=2 france=3" "^(\S+) .*? \1=(\d+)" RewriteCond "%2 $2 napitki=1 eda=2 odezhda=3" "^(\S+) (\S+) .*? \2=(\d+)" RewriteRule ^([^/]+)/([^/]+)$ cat.php?country=%1&id=%3 [L]
Подскажите как добавить третье условие? RewriteCond "%3 $3 sok=101 voda=102 limonad=103" "^(\S+) (\S+) (\S+) .*? \3=(\d+)" PHP: RewriteCond "$1 germany=1 italy=2 france=3" "^(\S+) .*? \1=(\d+)" RewriteCond "%2 $2 napitki=1 eda=2 odezhda=3" "^(\S+) (\S+) .*? \2=(\d+)" RewriteCond "%3 $3 sok=101 voda=102 limonad=103" "^(\S+) (\S+) (\S+) .*? \3=(\d+)" RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ cat.php?country=%1&id=%3&id2=%5 [L]
А можно конкретный пример как сделать рерайт этого примера: PHP: RewriteCond "$1 germany=1 italy=2 france=3" "^(\S+) .*? \1=(\d+)" RewriteCond "%2 $2 napitki=1 eda=2 odezhda=3" "^(\S+) (\S+) .*? \2=(\d+)" RewriteCond "%3 $3 sok=101 voda=102 limonad=103" "^(\S+) (\S+) (\S+) .*? \3=(\d+)" RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ cat.php?country=%1&id=%3&id2=%5 [L]
PHP: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . model.php Ну так можно отобразить любой ЧПУ адрес. Собственно как быть с переменными? Как отображать страницы которые есть? /germany/napitki /italy/odezhda /france/eda /france/odezhda /italy/napitki И как отображать NOT FOUND для тех страниц которых не должно быть?
Именно. Роутингом будет твой пхп-скрипт заниматься. Он о твоих странах и жрачках знает больше чем веб-сервер. С какими? С аргументами гет-запроса? Они будут прилеплены при рерайте и попадут в пхп-машину Это уже к тебе вопрос. Взял адрес, как-то обработал, где-то поискал, что-то показал. header('http/1.0 404 Not found'); + текст печальной страницы + exit; И всё.
А как сделать чтобы ошибка 404 выводилась при любом написании, например как здесь - https://php.ru/test , где test несуществующая страница(может быть и test2 и test3), и нету никакого редиректа на not_found.php или 404.html. Всё отображается на несуществующей странице! Как я понимаю это хорошо для SEO? Как это можно реализовать?
Скажем есть такой вот ЧПУ адрес - site.ru/italy/napitki, как php узнает что italy это $country=2, а napitki это $id=1 ??? Или же надо делать условие если $_SERVER['PHP_SELF'] = /italy/napitki создавай переменные $country=2 и $id=1 ???
regex, регулярные выражения, можно и простым explode обойтись, но с regex больше возможности по распознаванию правильной структуры, в базе или ещё где храни соответствия napitki = 1 и т.д.
И не совсем понятно с ошибкой 404 Это правило перестаёт работать: PHP: ErrorDocument404 /404 ErrorDocument 403 /404 RewriteRule^404$ /?404 [L] Когда начинаем использовать правило единой точки входа: PHP: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . model.php В model.php делаем проверку на запрашиваемую несуществующую страницу(для теста): PHP: if($_SERVER['REQUEST_URI'] == "/test") { header('http/1.0 404 Not found'); exit (); } Да, так получаем стандартную страницу от Chrome с HTTP/1.1 404 Not Found, которая так же правильно возвращает код ошибки 404 , но у меня была уже своя настроенная 404 страница с этими правилами: PHP: ErrorDocument404 /404 ErrorDocument 403 /404 RewriteRule^404$ /?404 [L] которая срабатывала всегда когда страница не найдена, так что не знаю как этим header('http/1.0 404 Not found'); настроить так же как было.
Вот так показывает настроенную 404 страницу(по адресу site.ru/test): PHP: if ($_SERVER['REQUEST_URI'] == "/test") { header("HTTP/1.1 404 Not Found"); include('404.php'); exit(); } Собственно как её показывать на все несуществующие страницы???
Обрабатываешь все существующие страницы, например у тебя массив с правилами и если правила закончились и не одно не подошло, то значит время показывать 404