Как многие из вас знают, когда кто-то создает вопрос StackOverflow, создается новая страница, которая также видна в различных поисковых системах. Мне было интересно, как PHP-код создал эти страницы. Оказывается, что большинство таких веб-сайтов имеют одну страницу, что-то вроде profile.php, и она загружает данные из базы данных MySQL. Мой вопрос заключается в следующем: если существует только один физический файл, как можно изменить URL-адрес и как Google отображает все страницы / профили / вопросы с таких сайтов, как StackOverflow или Facebook, если существует только одна фактическая страница?
Посмотрите на URL страницы, на которой находится этот вопрос:
http://stackoverflow.com/questions/39457314/how-does-php-create-new-html-pages
На жестком диске сервера нет физического файла. Есть только один главный скрипт, который называется «показать страницу с вопросом». Что произойдет, в целом, для динамически генерируемой страницы:
URL-адрес изменяется со «дружественного» URL-адреса на «уродливый» внутренний. Хотя Stackoverflow не написан на PHP, если бы это было так, вы бы внутри получили нечто подобное:
http://stackoverflow.com/showquestion.php?id=39457314
Веб-сервер выполняет showquestion.php
скрипт
Как явствует из комментариев, это обрабатывается перезаписью URL на HTTP-сервере.
Это может помочь узнать, что URL-адрес соответствует физическому файлу PHP с тем же путем по умолчанию, но это может быть переопределено. Вы можете создать правила перезаписи Apache, чтобы запрос URL обрабатывался любым скриптом PHP.
Пример показан в https://framework.zend.com/manual/1.12/en/project-structure.rewrite.html:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Таким образом, все URL-адреса действительно обрабатываются index.php
независимо от того, что говорит URL. В этом сценарии код может прочитать исходный запрос, а затем код может решить, что компоненты этого запроса означают для приложения.
Apache (и, следовательно, PHP) использует mod_rewrite переписать URL-адреса в более читаемые имена, похожие на каталоги. Например, вы можете использовать его, чтобы включить
www.example.com/index.php?area=blog&which=entry
в
www.example.com/blog/entry
Заголовки HTTP не обязательно должны соответствовать реальной файловой системе, поэтому Apache «подделывает» их во все, что хочет.
Возможно, возможно обойтись без mod_rewrite, но я не знаю достаточно, чтобы сказать
Ответ — маршрутизация.
Возьмем пример URL-адреса … httml: //www.mysite.com/users/profile/jimmy
Если вы используете систему маршрутизации (у большинства фреймворков такая есть), то все, что идет после .com / (называемое ‘path’), обрабатывается как карта. Система маршрутизации использует эту карту для поиска данных.
Многие системы маршрутизации разбивают этот «путь» на сегменты. Приведенный выше пример будет разбит на следующие сегменты.
Для большинства фреймворков система маршрутизации интерпретирует карту следующим образом …
controller/action/param-1/param-2/param-3
«Контроллер» относится к «классу» в объектно-ориентированном PHP
«Действие» — это еще одно слово для «функции», также называемое «метод».
наконец, параметры относятся к данным, которые мы хотим передать, возможно, это имя, обычно это идентификатор.
Маршрутизатор возьмет приведенный выше пример ‘path’ и продолжит поиск следующим образом …
Занимает первый сегмент. Ищет «класс» под названием пользователи. Находит класс под названием пользователи. Ищет функцию с именем profile внутри класса, называемого users. Находит функцию профиля. Передает данные в функцию. Выполняет функцию с переданными данными.
Вот базовая структура кода, которую маршрутизатор будет искать
<?php
class Users // the controller
{
function profile($name) // the action
{
'Profile for ' . $name; // the passed data 'jimmy'
}
}
Например, вы указываете поисковым системам «Google, Bing, ..etc», чтобы они видели ваш веб-сайт, давая им sitemap.xml
список ваших страниц, разрешить их веб-ботам (паукам) доступ также к сайту и сканировать данные и ссылки, у вас может быть одна страница как posts.php
и это отличается с параметрами posts.php?id=123
или же posts.php?name=mypost
Отредактировано:
Если вы хотите использовать один файл posts.php
и сделать сайт http://domain.com/posts/posttitle
вам нужно применить шаблон Front Controller ссылка на сайт и это подразумевает настройку сервера Apache / Nginx для перенаправления запросов в один файл (перезапись URL), и этот файл содержит логику для обработки запроса или использования инфраструктуры MVC