|
|
|
| началось! один заказчик попросил сделать ему "человеческие" урлы.
дошел и до нас этот идиотизм... причем, в самой изощренной форме - не просто cat/subcat/tovar/, а еще и название товара или страницы в URL, да по-гречески, да с html на хвосте (как будто робот не поймет, что это тот же php!)
делаю так.
1. ссылки в меню переделала в вид /page/hor/3//O_Katalogos.html (название пишу по-гречески, просто тут на латиницу заменила. два слэша подряд тоже не случайно, там потом будет номер страницы)
2. .htaccess
RewriteBase /
RewriteEngine on
RewriteCond $1 !^index\.php$
RewriteRule ^(.*)$ /index.php [L,R]
RewriteCond $1 !^contact\.php$
RewriteRule ^(.*)$ /contact.php [L,R]
RewriteRule ^images/(.+)$ images/$1 [E=REDIRECT_DONE:true]
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z0-9]+)\.html?$ page.php?menu=$1&menuitem=$2&start_from=$3 [L]
|
в таком виде работает, и нужный файл открывает (page.php) и URL в адресной строке в
таком виде почти устраивает. потом уже в page.php разбираю параментры и выдаю
нужную страницу
потом решаю убрать из ссылок лишний уровень (page/), и тут же перестает работать.
возвращаю обратно /page в ссылки, убираю .htaccess вообще, чищу кэш, перезапускаю Apach - все равно работает переадресация! это как?
подскажите, как переделать выражение
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z0-9]+)\.html?$ page.php?menu=$1&menuitem=$2&start_from=$3 [L]
|
, чтобы обрабатывались ссылки вида
и зачем писать параметры тут
page.php?menu=$1&menuitem=$2&start_from=$3
|
если они передаются и просто в page.php???
вывожу массив _GET в файле page.php - там все:
Array (
[0] => page
[1] => hor
[2] => 3
[3] => 0
[4] => %CE%9F_%CE%9A%CE%B1%CF%84%CE%AC%CE%BB%CE%BF%CE%B3%CE%BF%CF%82.html )
|
но мне не нужен первый элемент page!
скажете - не нужен, не бери. я и не беру, последний мне тоже не нужен, например. я не могу
понять, почему, если я этот page/ уберу из линка, который преобразовываю, то страница не
находится? даже, если я его переименую - вместо page напишу gall - не находится. | |
|
|
|
|
|
|
|
для: elenaki
(17.01.2013 в 10:11)
| | оставила только три строчки.
RewriteEngine on
RewriteBase /e-Catalogue/
RewriteRule ^([a-zA-Z]+)/([0-9]+)/([0-9]+)/([\?]+)\.html$ page.php [L]
|
на локалке работает. на сервере нет. сначала выдавало error 500. убрала BOM. выдает 404.
хостеры уверяют, что mod_rewrite подключен и работает. значит, проблема в htaccess? не
нашла пока, что писать в RewriteBase - один слеш или какой-то путь? какой? htacess лежит
в корне сайта, но сам сайт находится в поддиректории (root/site_name/.htaccess) | |
|
|
|
|
|
|
|
для: elenaki
(17.01.2013 в 15:48)
| | Нет параметры после page.php передавайте обязательно - это у вас на локалке что-то странное творится, не должно быть такого. | |
|
|
|
|
|
|
|
для: elenaki
(17.01.2013 в 10:11)
| | >подскажите, как переделать выражение
>/hor/3//O_Katalogos.html
Попробуйте такое регулярное выражение
^([a-zA-Z]+)/([a-zA-Z]+)?/([a-zA-Z0-9]+)\.html?$
|
| |
|
|
|
|
|
|
|
для: cheops
(17.01.2013 в 21:47)
| | 404 возвращает | |
|
|
|
|
|
|
|
для: elenaki
(17.01.2013 в 10:11)
| | >вывожу массив _GET в файле page.php - там все:
Вообще довольно странно - не должно быть такого. Это у вас локально или на сервере? | |
|
|
|
|
|
|
|
для: elenaki
(17.01.2013 в 10:11)
| | Включите лог mod_rewrite на уровне виртуального хоста
RewriteLog "/path/to/logs/rewrite.log"
RewriteLogLevel 3
|
Станет немного понятнее в чем дело. Кроме того, для таких общих правил как page.php добавьте проверки RewriteCond исключающие реальные файлы и папки - когда apache их встречает он без этих правил зацикливается, так как ссылки, полученные в результате Rewrite-преобразования снова подвергаются Rewrite-преобразованию и так до тех пор, пока .htaccess не будет пройден до конца и ни одно правило не сработает. | |
|
|
|
|
|
|
|
для: cheops
(17.01.2013 в 22:00)
| | это в httpd? у меня на сервере к нему доступа нет, а на локалке нет ошибок, чтоб их писать... | |
|
|
|
|
|
|
|
для: elenaki
(17.01.2013 в 10:11)
| | лучше напишите примитивный редиректор средствами php, пусть .htaccess просто переадресует все запросы на него, это очень просто. редиректор будет разбирать урл и подключать нужный скрипт. суффикс можно вообще отбрасывать, каким бы он ни был.
и нормальные урлы - это совсем не идиотизм | |
|
|
|
|
|
|
|
для: psychomc
(18.01.2013 в 00:21)
| | это "просто" у меня как раз и не получается. к тому же у меня page.php и есть тот самый
редиректор, я в нем разбираю URL. меня вполне устраивает URL вида site/page/menu/cat_id/subcat_id.
при стирании линка назад выводится более общая инаформация. а клиент хочет УРЛ в виде
site/nazvanie_kategorii/nazvanie_podkategorii/nazvanie_statyi и что получится при стирании
линка назад??? ерунда. к тому же никто все равно никто никогда не запомнит такие линки,
робот знает, что это не html,a php. я же искала по теме, прочитала много. никакой пользы от таких линков. | |
|
|
|
|
|
|
|
для: elenaki
(18.01.2013 в 00:36)
| | см мой пост снизу.
если нужен суффикс .html, просто перед explode сделайте
<?php
$parsed_url["path"] = str_replace(".html", "", $parsed_url["path"]);
|
| |
|
|
|
|
|
|
|
для: psychomc
(18.01.2013 в 00:21)
| | чтобы не быть голословным покажу на примере
.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php/?$ / [R=301,L]
RewriteRule ^index.php/(.*)$ $1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(js|ico|gif|jpg|png|css)$ redirector.php/$1 [L]
</IfModule>
|
redirector.php
<?php
function get_url_parts() {
$parsed_url = parse_url($_SERVER["REQUEST_URI"]);
return explode("/", trim($parsed_url["path"], "/"));
}
$url_parts = get_url_parts();
$count_parts = count($url_parts);
if ($count_parts == 0) {
require "index.php"; exit;
}
if ($url_parts[0] == "catalog") {
if ($count_parts == 1) {
require "catalog.php"; exit;
} elseif ($count_parts == 2) {
require "product.php?id=" . (int) $url_parts[1]; exit;
}
}
// ...
require "404.php";
|
примерно такой подход используется в wordpress. это не универсальное решение, но довольно удобно в пределах одного сайта. | |
|
|
|
|
|
|
|
для: psychomc
(18.01.2013 в 00:39)
| | спасибо, конечно. про WordPress знаю. в OzCommerce такая же штука есть.
мне не нужно переадресовывать все файкы, кроме картинок, скриптов и стилей. только те,
которые заканчиваются на html (добавить html к хвосту линка я в состоянии). но кроме того,
что они заканчиваются на .html, перед именем файла стоят несколько букв и цифр, которые
необходимы для дальнейшей передачи параметров на page.php - это какое меню (hor|vert),
категория меню ([0-9]+), номер страницы, если их несколько в этой категории ([0-9]+). это у
меня делало правило
^([a-zA-Z]+)/([0-9]+)/([0-9]+)/([a-zA-Z0-_]+)\.html$
|
вроде, нормально все было. но обнаружилось, что передается один лишний параметр (page),
из-за этого приходится и в линк его вставлять, хотя он никакой нагрузки не несет. но ни
изменить его, ни удалить не получается - сразу страница не находится, т.е. правило не
срабатывает и переадресация на page.php не делается. мне и так понятно, что страницы
*.html у меня нет и быть не может.
сделала как вы предложили. не успела создать файл redirtector.php, пошла в браузер проверить
и ... все работает как раньше! т.е. делается переадресация на page.php, хотя в .htaccess уже
написано redirector.php! это как? Apache перезапустила, кэш очистила. у меня что-то с сервером?
или с головой? | |
|
|
|
|
|
|
|
для: elenaki
(18.01.2013 в 12:25)
| | удалила вообще ВСЕ .htaccess' ы, которые были, очистила кэши, перезапустила Апач не кнопкой, а через
windows - все равно работает переадресация (по старому типу, с параметром page).
я счас свихнусь. комп выключить? как оно продолжает работать, если НЕТ никакого htaccess'a??? | |
|
|
|
|
|
|
|
для: elenaki
(18.01.2013 в 13:04)
| | скорее всего это какой-то жесткий кэш, другого объяснения я не вижу. как вариант, попробуйте просто создать новый локальный виртуальный хост и делать всё на нем, с другим подходом.
просто на будущее, если будете делать человеко-понятные урлы на голом php, то смело используйте тот подход, что я описал выше. мне он показался намного удобнее. я раньше в основном делал именно так, только потом уже написал полноценный роутер. | |
|
|
|
|
|
|
|
для: elenaki
(18.01.2013 в 13:04)
| | Включите все же логгирование mod_rewrite - он покажет правила и почему он так делает - будет проще найти, может где-то есть правила на уровне httpd.conf. | |
|
|
|
|
|
|
|
для: cheops
(19.01.2013 в 09:51)
| | включаю, как было предложено - Апач вообще не запускается | |
|
|
|
|
3.2 Кб |
|
|
для: elenaki
(19.01.2013 в 12:34)
| | FF и после полного удаления файла и перезагрузки компа сегодня продолжал делать уже
неправильную переадресацию!!!!0 т.е. успел вчера заглотить одну из ошибочных версий
.htaccess и никак не хотел ее из кэша выплевывать. пришлось запускать index из списка
сайтов, а не через адресную строку . открылся... забуду пока этот кошмар. сделаю вообще
по-другому (см. аттач) | |
|
|
|
|
|
|
|
для: elenaki
(19.01.2013 в 14:13)
| | А если другой браузер пока временно использовать для теста? Или FireBug с консолью нужны для отладки front-части? | |
|
|
|