я видел много сайтов на основе php, где неважно, куда вы перемещаетесь, застряв в index.php, и некоторые случайные параметры передаются в URL-адресе. и когда я смотрю версию с открытым исходным кодом, которая делает то же самое, index.php имеет кучу включений в них
Какой основной способ я могу сделать то же самое? это включает mod rewrite?
благодаря
Я видел это и лично считаю, что это ужасный дизайн. Особенно потому, что многие люди не склонны дезинфицировать параметр 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 для этого ).
Во всяком случае, вернемся к тому, почему я думаю, что это ужасная идея. Они делают это, потому что они, как правило, хотят иметь общий код на каждой странице (например, верхний и нижний колонтитулы). Я бы сказал, что вам лучше всего включить обычный файл в верхней части каждой из ваших страниц. Это более простой и понятный дизайн.
Это очень распространенный шаблон проектирования, а не только для PHP – я впервые использовал его для Cold Fusion с моделью под названием Fusebox, но подобные идеи существуют для всех языков сценариев.
В основном страница индекса собирает отображаемый HTML в зависимости от того, что передается в параметре. Например, если никакие параметры не переданы, он будет знать, чтобы втянуть и отобразить страницу по умолчанию, или если параметр говорит что-то вроде «? P = contact», тогда он отображает страницу контактов.
Идея mod-rewrite работает по-другому и часто используется с шаблоном проектирования модели-представления-контроллера (MVC). Например, на странице контактов сайтов может быть URL:
http://www.mysite.com/infopages/contact
и mod rewrite переведут это на
http://www.mysite.com/index.php?p=contact
MVC является очень кодовым способом разработки веб-сайтов и хорошо работает с более крупными и / или более сложными приложениями. Это немного над вершиной для небольших сайтов.
Конечно, они включают в себя, с некоторой проверкой, но в основном это что-то вроде этого:
include("content/".$_GET['something'].".php");
Вы также можете сделать это, используя «что-то» в качестве ключевого слова базы данных, но большинство index.php? Somthing = где-то, что я видел, включает в себя некоторую проверку работоспособности.
Способ, которым это работает, заключается в том, что приложение больше не записывается как набор страниц, а как монолитное целое, разделенное на несколько файлов. Другими словами, index.php
является приложением, и он принимает параметры, чтобы контролировать, какую часть он показывает вам.
Существуют различные способы передачи информации о странице в URL. Использование ссылок на фактические имена файлов не должно быть первым способом, которым вы пытаетесь это сделать. Вместо этого разделите приложение на разные команды и подкоманды. Тогда первые две вещи tht index.php
:
Второй – поиск какого-то рода, либо в массив, либо поиск класса или, возможно, файла в определенном каталоге. Как бы то ни было, он должен рассматривать его как ненадежные данные и создавать страницу с ошибкой или страницу по умолчанию с баннером ошибок, если команда недействительна. (Если он будет использоваться в имени файла, убедитесь, что он соответствующим образом преобразован [например .php
добавлен] и проверен на любое действие джейлбрейка [например, нет встроенных косых черт]).
Вы смотрите на веб-сайты, созданные с помощью фронтального контроллера.
http://en.wikipedia.org/wiki/Front_controller
Многие популярные PHP-приложения, такие как Joomla, используют его для обработки набора скриптов как связующего приложения.
Передний контроллер является хорошей идеей для таких языков, как PHP, но не забудьте скрыть фронт-контроллер чем-то вроде mod_rewrite, чтобы создать канонизацию URL и оптимизировать читаемость.
Этот тип URL позволяет использовать один файл шаблона, который указывает общую разметку, с включенным фрагментом, который содержит определенный текст. Это включало, что фрагмент может быть фактическим файлом в файловой системе или может быть CLOB в базе данных, причем параметр «страница» дает первичный ключ.
Как отмечали другие люди, прохождение точного пути совсем не безопасно – не делайте этого. В лучшем случае его можно использовать для проверки вашего сайта и получения непубличного контента. В худшем случае он может превратить ваш сайт в невольный прокси для контента, который вы не хотите юридически связать с вами. Где-то между ними он может предоставить хакеру возможность физически вставлять новый контент на ваш сайт.
Более безопасный подход заключается в использовании таблицы базы данных или (для небольших сайтов) таблицы страниц в памяти. Вот код, который я использую для доступа к таблице страниц для моего личного сайта:
$pageName = (array_key_exists("page", $_GET)) ? $_GET["page"] : null; $currentPage = (array_key_exists($pageName, $pagetab)) ? $pagetab[$pageName] : $pagetab["home"];