Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: человеческие линки
 
 автор: elenaki   (17.01.2013 в 10:11)   письмо автору
 
 

началось! один заказчик попросил сделать ему "человеческие" урлы.
дошел и до нас этот идиотизм... причем, в самой изощренной форме - не просто 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]


, чтобы обрабатывались ссылки вида


/hor/3//O_Katalogos.html


и зачем писать параметры тут
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 в 15:48)   письмо автору
 
   для: 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)

  Ответить  
 
 автор: cheops   (17.01.2013 в 22:00)   письмо автору
 
   для: elenaki   (17.01.2013 в 15:48)
 

Нет параметры после page.php передавайте обязательно - это у вас на локалке что-то странное творится, не должно быть такого.

  Ответить  
 
 автор: cheops   (17.01.2013 в 21:47)   письмо автору
 
   для: elenaki   (17.01.2013 в 10:11)
 

>подскажите, как переделать выражение
>/hor/3//O_Katalogos.html
Попробуйте такое регулярное выражение
^([a-zA-Z]+)/([a-zA-Z]+)?/([a-zA-Z0-9]+)\.html?$

  Ответить  
 
 автор: elenaki   (17.01.2013 в 23:09)   письмо автору
 
   для: cheops   (17.01.2013 в 21:47)
 

404 возвращает

  Ответить  
 
 автор: cheops   (17.01.2013 в 21:50)   письмо автору
 
   для: elenaki   (17.01.2013 в 10:11)
 

>вывожу массив _GET в файле page.php - там все:
Вообще довольно странно - не должно быть такого. Это у вас локально или на сервере?

  Ответить  
 
 автор: cheops   (17.01.2013 в 22:00)   письмо автору
 
   для: elenaki   (17.01.2013 в 10:11)
 

Включите лог mod_rewrite на уровне виртуального хоста
RewriteLog "/path/to/logs/rewrite.log"
RewriteLogLevel 3

Станет немного понятнее в чем дело. Кроме того, для таких общих правил как page.php добавьте проверки RewriteCond исключающие реальные файлы и папки - когда apache их встречает он без этих правил зацикливается, так как ссылки, полученные в результате Rewrite-преобразования снова подвергаются Rewrite-преобразованию и так до тех пор, пока .htaccess не будет пройден до конца и ни одно правило не сработает.

  Ответить  
 
 автор: elenaki   (17.01.2013 в 23:12)   письмо автору
 
   для: cheops   (17.01.2013 в 22:00)
 

это в httpd? у меня на сервере к нему доступа нет, а на локалке нет ошибок, чтоб их писать...

  Ответить  
 
 автор: psychomc   (18.01.2013 в 00:21)   письмо автору
 
   для: elenaki   (17.01.2013 в 10:11)
 

лучше напишите примитивный редиректор средствами php, пусть .htaccess просто переадресует все запросы на него, это очень просто. редиректор будет разбирать урл и подключать нужный скрипт. суффикс можно вообще отбрасывать, каким бы он ни был.
и нормальные урлы - это совсем не идиотизм

  Ответить  
 
 автор: elenaki   (18.01.2013 в 00:36)   письмо автору
 
   для: 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. я же искала по теме, прочитала много. никакой пользы от таких линков.

  Ответить  
 
 автор: psychomc   (18.01.2013 в 00:40)   письмо автору
 
   для: elenaki   (18.01.2013 в 00:36)
 

см мой пост снизу.
если нужен суффикс .html, просто перед explode сделайте

<?php
$parsed_url
["path"] = str_replace(".html"""$parsed_url["path"]);

  Ответить  
 
 автор: psychomc   (18.01.2013 в 00:39)   письмо автору
 
   для: 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. это не универсальное решение, но довольно удобно в пределах одного сайта.

  Ответить  
 
 автор: elenaki   (18.01.2013 в 12:25)   письмо автору
 
   для: 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 в 13:04)   письмо автору
 
   для: elenaki   (18.01.2013 в 12:25)
 

удалила вообще ВСЕ .htaccess' ы, которые были, очистила кэши, перезапустила Апач не кнопкой, а через
windows - все равно работает переадресация (по старому типу, с параметром page).
я счас свихнусь. комп выключить? как оно продолжает работать, если НЕТ никакого htaccess'a???

  Ответить  
 
 автор: psychomc   (18.01.2013 в 14:16)   письмо автору
 
   для: elenaki   (18.01.2013 в 13:04)
 

скорее всего это какой-то жесткий кэш, другого объяснения я не вижу. как вариант, попробуйте просто создать новый локальный виртуальный хост и делать всё на нем, с другим подходом.
просто на будущее, если будете делать человеко-понятные урлы на голом php, то смело используйте тот подход, что я описал выше. мне он показался намного удобнее. я раньше в основном делал именно так, только потом уже написал полноценный роутер.

  Ответить  
 
 автор: cheops   (19.01.2013 в 09:51)   письмо автору
 
   для: elenaki   (18.01.2013 в 13:04)
 

Включите все же логгирование mod_rewrite - он покажет правила и почему он так делает - будет проще найти, может где-то есть правила на уровне httpd.conf.

  Ответить  
 
 автор: elenaki   (19.01.2013 в 12:34)   письмо автору
 
   для: cheops   (19.01.2013 в 09:51)
 

включаю, как было предложено - Апач вообще не запускается

  Ответить  
 
 автор: elenaki   (19.01.2013 в 14:13)   письмо автору
3.2 Кб
 
   для: elenaki   (19.01.2013 в 12:34)
 

FF и после полного удаления файла и перезагрузки компа сегодня продолжал делать уже
неправильную переадресацию!!!!0 т.е. успел вчера заглотить одну из ошибочных версий
.htaccess и никак не хотел ее из кэша выплевывать. пришлось запускать index из списка
сайтов, а не через адресную строку . открылся... забуду пока этот кошмар. сделаю вообще
по-другому (см. аттач)

  Ответить  
 
 автор: cheops   (19.01.2013 в 14:57)   письмо автору
 
   для: elenaki   (19.01.2013 в 14:13)
 

А если другой браузер пока временно использовать для теста? Или FireBug с консолью нужны для отладки front-части?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования