как веб-сайты делают это index.php? что-то = somepage - PullRequest
3 голосов
/ 14 февраля 2009

Я видел множество сайтов на основе php, где независимо от того, где вы перемещаетесь, застряли в index.php, и некоторые случайные параметры передаются в URL. и когда я смотрю на версию с открытым исходным кодом, которая делает то же самое, у index.php есть куча включений в них

Как я могу сделать то же самое? это включает мод переписать?

спасибо

Ответы [ 6 ]

6 голосов
/ 14 февраля 2009

Я видел это, и лично я думаю, что это ужасный дизайн. В частности, потому что многие люди не склонны очищать параметр include, чтобы кто-то мог включить любой файл, который он хочет, просто передавая относительный путь.

mod_rewrite обычно используется для скрытия URL-адресов, таких как:

/index.php?path=user&include=account

заменив его чем-то вроде:

/user/account

как это:

RewriteEngine On
RewriteBase /
RewriteRule ^(\w+)/(\w+)$ /index.php?path=$1&include=$2 [L]

Я также обычно добавляю что-то вроде этого:

RewriteRule %{THE_REQUEST} \.php$ [R=404,L]

Я забыл точный синтаксис, но в основном дело в том, что пользователь не может напрямую запросить php-файл. Это должно быть сделано с помощью другого RewriteRule (как и первый), который может избавить вас от многих головных болей с дезинфекцией ввода строки запроса, а также избежать всей проблемы создания PHP глобальных слов для вещей, которые вы никогда не собирались (хотя они все еще могут POST для этого ).

В любом случае, вернемся к тому, почему я думаю, что это ужасная идея. Они делают это потому, что хотят иметь общий код на каждой странице (например, верхний и нижний колонтитулы). Я бы сказал, что вам лучше просто включить общий файл в верхней части каждой из ваших страниц. Это более простой и понятный дизайн.

2 голосов
/ 14 февраля 2009

Они делают прямые включения, с некоторой проверкой, конечно, но в основном это что-то вроде этого:

include("content/".$_GET['something'].".php");

Вы также можете сделать это, используя «что-то» в качестве ключевого слова базы данных, но большинство index.php? Somthing = где-то, что я видел, включают в себя некоторые проверки работоспособности.

2 голосов
/ 14 февраля 2009

Это очень распространенный шаблон проектирования, и не только для PHP - я впервые использовал его для Cold Fusion с моделью проектирования под названием Fusebox, но аналогичные идеи существуют для всех языков сценариев.

В основном страница индекса собирает отображаемый HTML в зависимости от того, что передано в параметре. Например, если никакие параметры не переданы, он будет знать, что нужно выдвинуть и отобразить страницу по умолчанию, или если параметр скажет что-то вроде «? P = contact», то он отобразит страницу контакта.

Идея переписывания модов работает наоборот и часто используется с шаблоном проектирования модель-представление-контроллер (MVC). Например, страница контактов сайта может иметь URL:

www.mysite.com / infopages / контакт

и мод переписать переведет это на

www.mysite.com / index.php? Р = контакт

MVC - это очень ориентированный на код способ проектирования веб-сайтов, который хорошо работает с более крупными и / или более сложными приложениями. Для небольших сайтов это немного перевес.

0 голосов
/ 16 февраля 2009

Этот тип URL позволяет вам использовать один файл шаблона, который определяет общую разметку, с включенным фрагментом, который содержит определенный текст. Этот включенный фрагмент может быть реальным файлом в файловой системе или CLOB в базе данных, а параметр «page» задает первичный ключ.

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

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

$pageName = (array_key_exists("page", $_GET))
          ? $_GET["page"]
          : null;
$currentPage = (array_key_exists($pageName, $pagetab))
             ? $pagetab[$pageName]
             : $pagetab["home"];
0 голосов
/ 16 февраля 2009

Вы просматриваете сайты, созданные с помощью фронтального контроллера.

http://en.wikipedia.org/wiki/Front_controller

Многие популярные PHP-приложения, такие как Joomla, используют его для обработки набора скриптов как связного приложения.

Фронт-контроллер - хорошая идея для таких языков, как PHP, но не забудьте спрятать фронт-контроллер с помощью что-то вроде mod_rewrite для создания канонизации URL и оптимизации читабельности.

0 голосов
/ 16 февраля 2009

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

Существуют различные способы передачи информации о странице в URL. Использование ссылок на реальные имена файлов не должно быть первым способом, которым вы пытаетесь это сделать. Вместо этого разделите ваше приложение на различные команды и подкоманды. Тогда первые две вещи, которые делает index.php:

  1. Настройка среды приложения (загрузка общих библиотек, настройка доступа к базе данных и т. Д. И т. Д.)
  2. Выясните, какая команда запрашивается.

Вторым будет какой-то поиск, либо в массив, либо в поиске класса или, возможно, файла в определенном каталоге. Что бы он ни делал, он должен обрабатывать его как ненадежные данные и создавать страницу ошибки или страницу по умолчанию с баннером ошибки, если команда недействительна. (Если оно будет использоваться в имени файла, убедитесь, что оно соответствующим образом преобразовано [например, .php добавлено] и проверено на любое действие для джейлбрейка [например, не имеет встроенных слешей]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...