LINUX.ORG.RU

[php]человеко-понятный url

 


0

1

Я странички на php пишу как на html, то есть например about.php, contacts.php и пр. Понимаю что это не правильно, но не знаю как это делается правильно. Как делают урлы подобные таким http://name.zone/about, http://name.zone/contacts Знаю что можно папок насоздавать about, contacts, а в них индексы, но это смех просто. Знаю что можно .php не писать вовсе, но это то же клоунада. Так вот вопрос: как это пишется правильно на php?



Последнее исправление: viktorzinchuk (всего исправлений: 1)

apache mod_rewrite, не?

aol ★★★★★
()

Apache? Тогда однозначно реврайты в htaccess.

VirRaa ★★★
()

Шёл 2012 год, а php всё не умел нормальных роутов из коробки...

В php - никак. Только через настройки веб-сервера.

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

Разве? А .htaccess?

Это настройка веб-сервера. Причём такая, какую мои nginx и lighttpd не поймут.

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

Я знаю. Просто затупил и под настройками сервера понял httpd.conf.

batekman ★★★
()

Вы меня не так поняли. Например есть cms drupal, так вот в нем при создании страниц, реальных .php или .html страниц не создается, данные для страниц содержатся в бд, вот это я и не знаю как, создать тупо страничек проблем нет, взять инфо для генерации страници из бд или текстовика, то же не проблема, проблема в том как это делают правильно.

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

проблема в том как это делают правильно.

Правильно это делают не на php, а в друпал это делают через настройки веб-сервера. Если просто кинуть друпал на любой сервер, не скопировав его специфические настройки - это работать не будет.

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

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

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

from bottle import route, run

@route('/hello/:name')
def index(name='World'): return '<b>Hello %s!</b>' % name

run(host='localhost', port=8080)

:)

Я ещё раз повторяю - это идёт замена адреса на уровне веб-сервера, т.е. это веб-сервер превращает /hello в /index.php?hello=hello, и уже так отдаёт php. PHP тут совсем не причём, он такого не умеет.

deb
()

Например так.

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

На самом деле задача создать ЧПУ комплексная, и ее решение слабо зависит от выбора web-сервера и языка.

Первый пункт - это заставить web-сервер принимать http-запросы по любому URL введенному посетителем сайта, и не разбираясь тупо переадресовывать их в одну точку входа. Эта точка чаще всего (и удобнее) файл index.php в корневом каталоге файловой структуры сайта. На этом работа web-сервера окончена. Любой современный web-сервер умеет это делать. В сети можно найти инструкции по настройке переадресации (rewrite) для Apache, Nginx, LightHTTPd и IIS. С другими я не сталкивался.

Далее в файле index.php производится инициализация приложения (движок сайта, если так понятнее), считываются ресурсы (настроечные параметры), и выполняется обработка маршрута по введенному посетителем URL. Далее выполнение передается контроллеру...

Раз ты пришел к необходимости озвученой в топике, то рано или поздно придешь к необходимости запилить архитектуру приложения на основе паттерна MVC (Модель-Вид-Контроллер).

Ничего лучше человечество, пока, не придумало. Хотя, как обычно, разошлись в тонкостях реализации. Самостоятельно ты не сможешь это сделать в приемлимые сроки. Время уйдет не только на реализацию, но и на приобретение понимания. Поэтому возьми готовый продукт, одну из современных CMF. Мне нравится Zend Framework.

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

Ну и не забудь рассмотреть побольше мнений.

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

Дошло но не совсем, теперь нуждаюсь в теории :) где это прописывается, в каких серверных файлах httpd? И что, неужели друпал для каждой созданной страници править этот файлик внося для каждой такую ботву, или там это более красиво реализовано а не кувалдой как я собираюсь?

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

Если апач и включены проверки на поиск .htaccess в каждой директории - то прописывается в неё. Не прибитого к конкретному серверу механизма - нет, поэтому на nginx будешь прописывать уже в его конфигах.

Пока не поздно, одумайся, воспользуйся уже более актуальными и простыми инструментами, чем php. :)

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

Тремя ответами выше пример на bottle.py

Пример на rails и django найдёшь, создав пустое приложение для них или посмотрев любое готовое.

deb
()

Всем спасибо, ушел читать что дали :)

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

А можно ссылкой ткнуть или прямо сюда? Не понимаю, как может быть реализован роутинг, без помощи веб-сервера.

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

В любом фреймворке на python или ruby есть куча встроенных и вебсерверов и прослоек, выбирай не хочу.

Ссылка - на главной странице http://bottlepy.org

Скопируй скрипт из 4х строчек выше, скопируй файл bottle.py (или поставь из репозитория) и запусти. Больше подробностей - на сайтах этих фреймворков.

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

В любом фреймворке на python или ruby есть куча встроенных и вебсерверов и прослоек, выбирай не хочу.

С этого и надо было начинать. То что веб-сервер реализован на том же языке - это не значит, что роутинг создаётся исключительно силами ЯП.

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

С этого и надо было начинать.

Не кормите троллей! (Администрация зоопарка)

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

Человеку проще прочитать. При сохранении ссылки и через столетие будет понятно что предполагается там найти. Ходят слухи что поисковики более благосклонны к таким ссылкам.

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

Пример на Perl Dancer:

База:

CREATE TABLE people (
	id INTEGER PRIMARY KEY AUTOINCREMENT,
	name VARCHAR(50)
);

Движок, который смотрит на url и возвращает, что нужно:

use warnings;
use strict;
use Dancer qw/syntax/;

get '/name=*' => {
	my $name = spalt; #достаём параметр из URL
        
        #готовим запрос к БД
	my $greet = database->prepare(
		SELECT name FROM people WHERE name = ?	
	;');

	$greet->execute($name);	#согласно полученному параметру
				#выполняем запрос
 
	# "Рисовать" страницу будет шаблон, внутрь которого
	# передаётся вытащенное из базы: 
	template 'hello.tt', {
		'name' => $greet->fetchrow_array,
	};
};

true;

Шаблон, который «рисует» страницу:

<div id="greeting"> Hello, [% name %]!</div>

Ну и там сверху CSS, яваскрипт, картиночки и т.д.

Теперь веб-сервер настраиваем так, чтобы он передавал запросы движку, выставляем права на директории и проч.

Теперь если кто-то посылает серверу запрос GET http://example.com/name=zinchuk, то сервер передаёт его движку, тот, как мы ему указали, берёт zinchuk из URL, что-то с ним делает, в данном случае достаёт из базы запись, у которой name = 'zinchuk', отдаёт результат шаблону, аккуратно упакованным в переменную, а шаблон генерирует веб-страничку, в которую в нужном месте подставляет значение переменной.

Похожим образом работает Sinatra, с которого Dancer содран.

Вообще возьми и напиши что-нибудь, делов-то. Гораздо лучше поймёшь

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

Да, микрофреймворк для начала самое оно.

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

Человеку проще прочитать

прочитать

Можно подумать, кто-нибудь будет вручную набирать

набирать

Бывали случаи, когда из-за подобного разногласия начиналась война.

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

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

Не знаю... Запили опрос на ЛОРе, там все равно ахинею опрашивают. Тут хоть польза будет.

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

Можно подумать, кто-нибудь будет вручную набирать адрес вроде [code] http://unitazy.ru/samaya_klevaya_firma/proizvodstvo_bide [/code]


Такой - нет.

А вот такой - http://wp-b.com/new/
или такой - http://omploader.org/r
или даже такой - http://bilets.org/trains/Самара/Москва/
я набираю ручками - т.к. быстрее.

Плюс человеко-понятные урлы хороши для SEO и лучше смотрятся в поисковой выдаче.

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

Сам хотел предложить Silex, поддерживаю.

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

Я ещё раз повторяю - это идёт замена адреса на уровне веб-сервера, т.е. это веб-сервер превращает /hello в /index.php?hello=hello, и уже так отдаёт php. PHP тут совсем не причём, он такого не умеет.

mod_rewrite верно написан? (комментарий)

anonymous
()

Писателей на Django / Rails печалит этот тред. А кое-кто ещё после этого называет рельсы недофреймворком, постыдились бы в 2012 годы URLы модулями апача разруливать :)

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

Мы опять рассуждаем про встроенный веб-сервер?

Чушь написали.
Во-первых, встроенный сервер для нужд разработки и тестирования, а не для роутинга путей.
Во-вторых, в PHP тоже можно роутить пути в самом приложении, просто это не общепринято, в отличие от Python`а.

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

Чушь написали.

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

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

Да. Объясняю на пальцах.

У нас есть сервер(Apache/Nginx/IIS/неважно) и приложение(написанное на Perl/Python/Common Lisp/неважно). Сервер принимает запросы от клиентов(ожидает запросы, открывает и закрывает соединения и еще много чего делает). Приложение отвечает за генерацию страниц исходя из запроса, а не только url(!). Взаимодействие между приложением и сервером осуществляется по-разному, исходя из используемых технологии - CGI/FastCGI/PSGI/... К примеру, в python-е это стандарт WSGI. Механизм роутинга можно написать самому или же воспользоваться готовой реализацией в библиотеке/фреймворке, т.е. механизм будет в приложении, где ему и место.

Но несмотря на все вышесказанное, у Апачи есть модули, которые позволяют сторонний софт запускать внутри себя, а точнее интерпретировать сторонние скрипты. И именно в силу того, что сервер и приложение в таком случае оказываются в одном месте, осуществить роутинг можно через конфигурационные файлы сервера -> .htaccess.

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

все нормальные фреймворки на пыхе умеют делать внятные роуты. Вброс был про то, что в 2012 году пых не умеет нормальные роуты. Питон и руби их тоже не умеют :) Ибо не нужно.

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

В любом случае все запросы надо будет редиректить на роутер. Но это одна строчка в конфиге

boombick ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.