LINUX.ORG.RU

ЧПУ на PHP

 , , , ,


0

2

Решил тут перенести свои проекты c дешевого хостинга с Апачем на VPS с nginx+php5-fpm. Но вот только загвоздочка. Все мои самописы используют апачевский .htaccess для ЧПУ и написаны на нативном ПХП без всяких там ооп, фреймворков, роутингов и прочего. Правил редиректов около сотни для каждого сайта, но структура похожая. Вот у меня встал вопрос как лучше поступить с ЧПУ. Переписать все правила на nginx или уменьшить количество правил rewrit'а, привязав все запросы к index.php, а все ЧПУ реализовать через php. Второе думаю будет правильнее, но займет больше времени и скорее всего увеличит время выдачи страниц. Сейчас сервер практически моментально выплевывает страницы и не хочется уменьшения скорости.

★★★

Я всю жизнь думал, что ЧПУ - это Числовое Програмное Управление для станков и пр. А что такое ЧПУ в свете пыхи и апачей?

Deleted
()

Для начала просто воспользуйся сервисами по типу htaccess -> nginx, это упростит начальный переезд. Тебе сгенерится конгиф nginx

duck
()
Ответ на: комментарий от Deleted

Я всю жизнь думал, что ЧПУ - это Числовое Програмное Управление для станков и пр.

Вот я тоже залез в тему посмотреть, кто это станки на пых-пыхе программирует. :-)

AS ★★★★★
()

А в чем сложность то? Заворачиваешь все запросы на index.php, а потом берёшь урл из $_SERVER[«REQUEST_URI»]. Делается легко в nginx и в apache. Главное не забыть написать исключение для статики (картинки, css, js)

xorik ★★★★★
()
Последнее исправление: xorik (всего исправлений: 1)
Ответ на: комментарий от erzent

что пора драйвера писать на php.

Хохма, надеюсь ? :-)

Использование ЯП, зависящего от внешнего от ПО конфига - это никуда не годно. Удел PHP - web, а за остальное надо бить линейкой по пальцам.

AS ★★★★★
()
Ответ на: комментарий от erzent

и ничего, работала.

Работать в заданном окружении заставить можно. Но допил и сопровождение - это ахтунг.

AS ★★★★★
()
Ответ на: комментарий от erzent

На ЛОРе же вроде обсуждали тоётовский софт для педали газа? Там даже на Цэ умудрились накостылять неработающее г...о, от которого люди гибли.

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

SEO - этот ещё не весь веб, а секта малограмотных шаманов

Термин «ЧПУ» в сабжевом контексте я впервые услышал за много лет до того, как услышал термин SEO :) В годах, эдак, 1998-м и 2003-м, соответственно.

Собственно, то, что URL «человеко-понятные», а не «поискбото-понятные» само намекает. Сперва, в данном случае, было яйцо, потом — курица. Сперва появились ЧПУ, потом их стали особо выделять боты. Чтобы начать что-то особо выделять, оно уже должно существовать :)

KRoN73 ★★★★★
()

nginx

Советую всё же lighttpd.
Конфиги легко гуглятся, с mod_write проблем нет.
С lighttpd достигнешь максимальной легкости, при хорошем функционале.

TheBear
()
Ответ на: комментарий от TheBear

Советую всё же lighttpd

Уже фактически мёртв :-/ И конфиги nginx намного гибче.

Я много лет был фанатом Лайти, но пару лет назад ушёл с него на Энжиникс.

KRoN73 ★★★★★
()

Переписать все правила на nginx или уменьшить количество правил rewrit'а, привязав все запросы к index.php, а все ЧПУ реализовать через php

второе.

в случае Apache — правило rewrite должно быть только *одно* (для одного сайта) .

далее index.php уже должен думать куда (к какому коду) переадресовывать запрос.

а при портировании этого кода из Apache на Nginx — проблем будет минимум.

ды и вообще проблем будет минимум. при таком подходе

Второе думаю будет правильнее, но займет больше времени и скорее всего увеличит время выдачи страниц.

хаха :) , с чего вдруг обработка десятка лишних PHP-строчек должна увеличивать врямя выдачи страницы?

маршрутизация URL — это не узкое горлышко, где могла сосредотачиваться бы вся нагрузка.

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 2)
Ответ на: комментарий от zevilz

> Поставить nginx+apache

не хочу я эту гадость ставить

всё верно! эти наслоения ни к чему..

либо уж Apache выбирать (например Apache с модулями: mod_suexec и mod_fcgid), либо Nginx, ..либо ещё какой-нибудь http-сервер.

а наслоения одного сервера над другим — это геморой помноженный в два раза :-)

user_id_68054 ★★★★★
()

Ты мне сейчас мозг сломал. Что, в станки теперь можно на ПХП писать?

Zhbert ★★★★★
()
Ответ на: комментарий от user_id_68054

далее index.php уже должен думать куда (к какому коду) переадресовывать запрос

Блин, это жеж движки переписывать придется)) Скорее всего перепишу, а то руки все не добераются свой говнокод переписать)

Тогда может сразу подскажешь, как проще и быстрее переписать, чтобы потом опять не переписывать? На одном из сайтов сейчас index.php выдает только главную. Категории, подкатегории, новинки и прочее выдает category.php. Отдельные карточки товаров выдает view_item.php. А отдельные страницы (некоторые из них с категориями), корзина и оформление заказа выдаются отдельными php файлами. Остальные сайты с похожей структурой.

zevilz ★★★
() автор топика
Ответ на: комментарий от AS

Я всю жизнь думал, что ЧПУ - это Числовое Програмное Управление для станков и пр.

Вот я тоже залез в тему посмотреть, кто это станки на пых-пыхе программирует. :-)

+1

yoghurt ★★★★★
()

ЧПУ на PHP

Жуть какая. Хорошо, что это не то, что я подумал.

sT331h0rs3 ★★★★★
()
Ответ на: комментарий от zevilz

Блин, это жеж движки переписывать придется)) Скорее всего перепишу,
а то руки все не добераются свой говнокод переписать)

Тогда может сразу подскажешь, как проще и быстрее переписать, чтобы
потом опять не переписывать? На одном из сайтов сейчас index.php
выдает только главную. Категории, подкатегории, новинки и прочее
выдает category.php. Отдельные карточки товаров выдает view_item.php.
А отдельные страницы (некоторые из них с категориями), корзина и
оформление заказа выдаются отдельными php файлами. Остальные
сайты с похожей структурой.

например так:

в .htaccess напиши:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

прошлый файл index.php переименуй в front_page.php..

а внутри index.php напиши:

<?php
// -*- mode: php; coding: utf-8 -*-

global $path;
$path = isset($_SERVER['REDIRECT_URL'])?$_SERVER['REDIRECT_URL']:'';

if (!$path || $path == '/') {
  include __DIR__.'/front_page.php';
  return;
}

if ($path == '/category' ||
        mb_substr($path, 0, mb_strlen('/category/')) == '/category/') {
  include __DIR__.'/category.php';
  return;
}

if ($path == '/view_item' ||
        mb_substr($path, 0, mb_strlen('/view_item/')) == '/view_item/') {
  include __DIR__.'/view_item.php';
  return;
}

// и так далее по налогии и все остальные страницы :) ...
//      (ну или быть может лучше было использовать
//      регулярные выражения.. дело вкуса :))

// ... ... ...
// ... блаблабла ...
// ... ... ...

include __DIR__.'/not_found_page.php'; // и не забыть про header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); внутри файла not_found_page.php

// END_OF_FILE

другие файлы (кроме этих двух: .htaccess и index.php ) редактировтаь НЕ придётся так как ты ведь всего-лишь переносишь часть кода из файла .htaccess в файл index.php (и не более того!)

думаю так :-)

# P.S.: когда будешь переносить на nginx (или ещё куда): переменная $path быть может как-то подругому будет инициализироваться.. но думаю найти способ как исправить — будет не сложно :-)

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 3)
Ответ на: комментарий от user_id_68054

Ок. Спасибо за помощь) Хороший и понятный пинок под зад) Думаю с мелочами разберусь.

zevilz ★★★
() автор топика
Ответ на: комментарий от zevilz

можно кстати НЕ за один раз переписать.

а например в один день перенести только половину от всех правил из файла ".htaccess" в новый файл «index.php»..

а во второй день — перенести все остальные правила.. :-)

короче это совсем не радикальное изменение, которое требовало *бы* переписывать весь код :-)

# P.S.: ведь всегда приятно растянуть работу на неделю, вместо того чтобы за пару часов быстренько всё сделать :-)

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 2)
Ответ на: комментарий от user_id_68054

Лет 6 назад начал осваивать пхп по дискам Попова. И все эти 6 лет только и занимаюсь тем, что переписываю код после его уроков)) У меня даже почти везде еще остались конструкции do-while вместо while и много всякой ненужной фигни) Лучше б после создания первого сайта создал новый движок, а не копировал часть первого. А причина одна - ЛЕНЬ))

zevilz ★★★
() автор топика
Ответ на: комментарий от wakuwaku

Сперва появились станки, и лишь потом — роботы?

Станки — это из другой области семантика :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Black_Roland

ЧеловекоПонятный УРЛ (URL)

ох уж эти хипсторы, лучше бы человекопонятной ссылкой назвали. но ведь нет, все им надо через одно место =)

ktk ★★★★
()
Ответ на: комментарий от ktk

ох уж эти хипсторы, лучше бы человекопонятной ссылкой назвали. но ведь нет, все им надо через одно место =)

а кстати, интересно, а как расшифровывается абриввиатура «УРЛ» :)

user_id_68054 ★★★★★
()

Жесть какая Щ_Щ

Автор, не ставь теги в которых ничего не понимаешь. Я уж подумал что пришел скайнет на пыхпыхе.

anonymous
()
Ответ на: комментарий от msgxx

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

anonymous
()
Ответ на: комментарий от Deleted

Только Erlang-CNC! Только хардкорные опердени ЧПУ!

anonymous
()
Ответ на: комментарий от user_id_68054

Вроде как для обычных страничек все понял. Но вот вот мозг сломал, как тут передавать переменные? К примеру, для каталога у меня вот так:

if ($path == '/catalog' ||
        mb_substr($path, 0, mb_strlen('/catalog/')) == '/catalog/') {
  include __DIR__.'/catalog.php';
  return;
}
а вот как пихнуть туда переменные для отображения категорий, подкатегорий и карточек товаров? Нужно что-то типа такого:
if ($path == '/catalog/([a-z-]+)/([a-z-]+)/([a-z0-9-]+)' ||
        mb_substr($path, 0, mb_strlen('/catalog/([a-z-]+)/([a-z-]+)/([a-z0-9-]+)')) == '/catalog/([a-z-]+)/([a-z-]+)/([a-z0-9-]+)') {
  include __DIR__.'/view_item.php?cat=$1&subcat=$2&item=$3';
  return;
}
elseif ($path == '/catalog/([a-z-]+)/([a-z-]+)' ||
        mb_substr($path, 0, mb_strlen('/catalog/([a-z-]+)/([a-z-]+)/) == '/catalog/([a-z-]+)/([a-z-]+)/') {
  include __DIR__.'/catalog.php?cat=$1&subcat=$2';
  return;
}
elseif ($path == '/catalog/([a-z-]+)' ||
        mb_substr($path, 0, mb_strlen('/catalog/([a-z-]+)/) == '/catalog/([a-z-]+)/') {
  include __DIR__.'/catalog.php?cat=$1';
  return;
}
else ($path == '/catalog' ||
        mb_substr($path, 0, mb_strlen('/catalog/')) == '/catalog/') {
  include __DIR__.'/catalog.php';
  return;
}

zevilz ★★★
() автор топика
Ответ на: комментарий от zevilz

На:

<?php


// говорим где будет директория с апликухой (может и выше паблик-хтмл)
define('APP', realpath('./app') . '/');


// разбираем строку запроса
$urlParts = explode('?', $_SERVER['REQUEST_URI']);
$myParts  = array();
foreach (explode('/', $urlParts[0]) as $part) {
    $part = trim($part);
    if (strlen($part) > 0) {
        $myParts[] = $part;
    }
}
// если просили главную (строка запроса пуста)
if (!$myParts) {
    $myParts[] = 'main';
}


// подключаем файл, там будут доступны остальные "части"
// а гет параметры через обычный $_GET
$fileName = APP . $myParts[0] . '.php';
if (is_file($fileName)) {
    require_once $fileName;
} else {
    require_once APP . 'error404.php';
}

.htaccess тот который выше писали.

deep-purple ★★★★★
()
Ответ на: комментарий от zevilz

ну примерно так:

global $path;
global $path_parts;

$path = isset($_SERVER['REDIRECT_URL'])?$_SERVER['REDIRECT_URL']:'';
$path_parts = explode('/', $path);

// ... блаблабла ...
// ... блаблабла ...
// ... блаблабла ...


if ($path == '/catalog' ||
        mb_substr($path, 0, mb_strlen('/catalog/')) == '/catalog/') {
  
  $cat = $path_parts[1];
  $subcat = $path_parts[2];
  
  include __DIR__.'/catalog.php';
  return;
  
  // внутри файла catalog.php -- уже смотри переменные $cat и $subcat
}

// ... блаблабла ...
// ... блаблабла ...
// ... блаблабла ...

а вообще, товарищ deep-purple — нормально предложил тут (выше) — ЧПУ на PHP (комментарий) .

вполне поддерживаю это решение (я сам так ранше сделал в пару местах, как у deep-purple в примере.. но потом решил отказаться от этого способа).

главное остерегаться PHP-инъекций (в его способе).. (конкретно у deep-purple в примере PHP-инъекций *нет*, но ты главное их не добавь туда случайно, так как вот это require_once $fileName; — очень опасное место)

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.