Забыли пароль?
Запросите новый здесь.

Автор темы: Pisatel
ID темы: 1774
Информация:
Тема содержит 13 сообщения, была просмотрена 7144 раз.
Просмотр темы
PHP-Fusion Russia » Веб-разработка » PHP
 Распечатать тему
Помощь с редиректом
Pisatel
Всем доброго времени суток! Мастера, нужна помощь. Сделал ЧПУ, страницы стали выглядеть, например, так article5-nazvanie-statyi, но прикол в том, что эта же статья откроется по старому адресу articles.php?article_id=5. Самым простым вариантом, конечно, будет прописать в роботс
Скачать исходники  Код
Disallow /*?
Disallow /*&



но хочется сделать редирект, дабы сохранить пузомерки и постепенно выкинуть старые страницы из индекса. Пробую нечто подобное
Загрузить источник  GeSHi: PHP
  1. if (preg_match("/\/articles.php?article_id=([0-9]+)/i", FUSION_REQUEST)){
  2. redirect(BASEDIR."article$1-(.*?)");
  3. }
Добавлено за 0.031 секунд, используя GeSHi 1.0.8.10

но не срабатывает чего-то...
 
Web
dark
Не помню точно, но кажется redirect(BASEDIR."article$1-(.*?)"); редиректит через яваскрипт. Проверь, для поисковиков это не очень. Лучше использовать

header("HTTP/1.1 301 Moved Permanently");
header("Location: ".путь);
 
FILON
Pisatel написал:
Загрузить источник  GeSHi: PHP
  1. if (preg_match("/\/articles.php?article_id=([0-9]+)/i", FUSION_REQUEST)){
  2. redirect(BASEDIR."article$1-(.*?)");
  3. }
Добавлено за 0.030 секунд, используя GeSHi 1.0.8.10

но не срабатывает чего-то...


Если Вы хотите вернуть результаты поиска из preg_match, то используйте дополнительный параметр $matches. То, что написали Вы (строка 2), мягко говоря, бред.
Загрузить источник  GeSHi: PHP
  1. int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
Добавлено за 0.031 секунд, используя GeSHi 1.0.8.10


dark написал:

Не помню точно, но кажется redirect(BASEDIR."article$1-(.*?)"); редиректит через яваскрипт.


Лучше изучаем параметры функции. По умолчанию перенаправление через HTTP-заголовок.
Загрузить источник  GeSHi: PHP
  1. void redirect ( string $location [, bool $script = false] )
Добавлено за 0.034 секунд, используя GeSHi 1.0.8.10

What's common between Halloween and Christmas? Every programmer knows: 31 oct = 25 dec.
 
Pisatel
FILON, благодарю за подсказку насчет возврата значений из поиска при совпадении. Но у меня чего-то даже true не получается вернуть... Например, пробую
Загрузить источник  GeSHi: PHP
  1. if (preg_match("/\/articles.php?article_id=([0-9]+)/i", FUSION_REQUEST)){
  2.  
  3. add_to_title("YES");
  4.  
  5. }
  6.  
Добавлено за 0.040 секунд, используя GeSHi 1.0.8.10

По идее, если я зайду на site.ru/articles.php?article_id=87 , то в титл статьи должно добавиться YES, но нету этого... В чем туплю?
 
Web
FILON
Pisatel написал:

Но у меня чего-то даже true не получается вернуть... В чем туплю?


Забыли экранировать служебные символы в регулярном выражении.

Скачать исходники  Код
#\/articles\.php\?article_id\=([0-9]+)#i



What's common between Halloween and Christmas? Every programmer knows: 31 oct = 25 dec.
 
Pisatel
FILON, экранировал, кроме "=", сейчас попробую.
Оффтопик Давай на "ты", мы ж без галстуков, и я еще не суперСТАР :-)

UPD
Не, не получается. Вставляю в includes/header_includes.php... Чет совсем бида...
Изменил(а) Pisatel, 15.09.2013 15:53
 
Web
FILON
Pisatel написал:
Оффтопик Давай на "ты", мы ж без галстуков, и я еще не суперСТАР :-)


ОК :)

Знак равенства по документации входит в список служебных символов, но и без его экранирования данное регулярное выражение будет работать.

PHP: preg_quote - Manual

В регулярных выражениях служебными считаются следующие символы: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -


UPD:

Попробуй такой вариант. Вместо комментария в коде добавь обработку значения переменной $data['article_subject'] (транслитерация, замена на escape-последовательности специальных символов и т.п.).

Загрузить источник  GeSHi: PHP
  1. if (preg_match("#\/articles\.php\?article_id\=([0-9]+)#i", FUSION_REQUEST, $matches)) {
  2. $result = dbquery("SELECT article_id, article_subject FROM ".DB_ARTICLES." WHERE article_id=".(isnum($matches[1]) ? $matches[1] : 0)." LIMIT 1");
  3. if (dbrows($result)) {
  4. $data = dbarray($result);
  5. // Clear and transliterate $data object
  6. redirect(BASEDIR."article{$data['article_id']}-{$data['article_subject']}");
  7. }
  8. }
Добавлено за 0.041 секунд, используя GeSHi 1.0.8.10

Изменил(а) FILON, 15.09.2013 16:45
What's common between Halloween and Christmas? Every programmer knows: 31 oct = 25 dec.
 
Pisatel
FILON, ага, вот так уже работает лучше- верное направление. Добавлю функцию- и все будет гуд! Спасибо! Жаль, лишнее подключение, но ведь это, я надеюсь, не навсегда: выпадут из индекса- можно просто через роботс запретить. Еще раз спасибо!
 
Web
dark
И все же я порекомендую пользоваться моим вариантом редиректа, а не стандартным.
Стандартный отдает заголовок

302 Moved Temporarily («перемещено временно»)


А в указанном случае требуется все же

301 Moved Permanently («перемещено навсегда»)


да бы "не давать лишние надежды поисковикам", что те страницы вернуться.
 
Pisatel
А что, если сделать альтернативу стандартной функции? Например, вот стандартная
Загрузить источник  GeSHi: PHP
  1. function redirect($location, $script = false) {
  2. if (!$script) {
  3. header("Location: ".str_replace("&amp;", "&", $location));
  4. } else {
  5. echo "<script type='text/javascript'>document.location.href='".str_replace("&amp;", "&", $location)."'</script>\n";
  6. }
  7. }
Добавлено за 0.042 секунд, используя GeSHi 1.0.8.10

Ну и что-то типа такого сделать

Загрузить источник  GeSHi: PHP
  1. function redirection($location, $script = false) {
  2. if (!$script) {
  3. header("HTTP/1.1 301 Moved Permanently");
  4. header("Location: ".str_replace("&amp;", "&", $location));
  5. } else {
  6. echo "<script type='text/javascript'>document.location.href='".str_replace("&amp;", "&", $location)."'</script>\n";
  7. }
  8. }
Добавлено за 0.040 секунд, используя GeSHi 1.0.8.10
 
Web
Zaxap
Как замутить 404 редирект для всех страниц с *.php так, чтобы страницы без *.php, "созданные в .htaccess", оставались рабочими?
Необходимо, чтобы при переходе, к примеру, на /news.php, система отвечала 404 ошибкой, а при переходе по /news/ пропускала.
Код выглядит примерно так в таком же порядке:
Скачать исходники  Код
RewriteRule ^news/$ /news.php [L]
RewriteRule ^news\.php$ /404.html [L,R=404]



Я, конечно, понимаю, что намудрил тут чего-то не так, но вот как к этому подойти иначе - черт знает...
В принципе, мне нужно запретить переход по всем url, содержащим *.php, вот и все...

А как такое вот на php замутить, если целесообразнее?


UP
Изменил(а) Zaxap, 08.04.2014 05:27
Зло не дремлет, а я добрый...
 
Pisatel
Зачем 404? Лучше ж 301, чтобы пс были довольны. У меня это выглядит так (includes/header_includes.php):
Загрузить источник  GeSHi: PHP
  1. function redirection($location, $script = false) {
  2.  
  3. if (!$script) {
  4.  
  5. header("HTTP/1.1 301 Moved Permanently");
  6.  
  7. header("Location: ".str_replace("&amp;", "&", $location));
  8.  
  9.  
  10. } else {
  11.  
  12. echo "<script type='text/javascript'>document.location.href='".str_replace("&amp;", "&", $location)."'</script>\n";
  13.  
  14.  
  15. }
  16.  
  17. }
  18.  
  19.  
  20. if (preg_match("/\/(articles|photogallery|news|contact|login|weblinks)\.php/i", FUSION_REQUEST, $matches)){
  21.  
  22.  
  23.  
  24. redirection(BASEDIR.$matches[1]);
  25.  
  26. }
  27.  
Добавлено за 0.043 секунд, используя GeSHi 1.0.8.10
x1
 
Web
Zaxap
Pisatel, спасибо! Заморочка у меня такая ab
Зло не дремлет, а я добрый...
 

Поделиться этой темой
Социальные закладки: Vkontakte Odnoklassniki Mail.ru Facebook Google Tweet This
URL:
BBcode:
HTML:

Перейти на форум: