Я разрабатываю свой первый PHP-сайт с приличным размером, и я немного смущен тем, что «правильный путь» (при условии, что когда-либо есть такая вещь) для обработки чистых / дружественных / симпатичных URL-адресов в приложении.
Как я вижу это, есть два основных варианта (в качестве примера я использую упрощенный сайт социальных новостей):
1. Используйте mod_rewrite для обработки всех потенциальных URL-адресов. Это будет выглядеть аналогично, но не идентично:
RewriteRule ^article/?([^/]*)/?([^/]*)/?([^/]*) /content/articles.php?articleid=$1&slug=$2 RewriteRule ^users/?([^/]*)/?([^/]*) /content/users.php?userid=$1&username=$2 RewriteRule ^search/?([^/]*)/? /content/search.php?query=$1
2. Передайте все на какой-либо скрипт обработчика и дайте ему позаботиться о деталях:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) handler.php?content=$1
Ясно, что это все непроверенный «воздушный код», но вы поняли суть.
Вариант 1 (.htaccess и несколько .php-файлов) часто использовался «в прошлом»; теперь, я вижу вариант 2 (каждый запрос, проходящий через один .php-файл), используется намного больше.
Основными преимуществами, которые я вижу в варианте 2, являются:
index.php
: если вам нужен какой-то код, выполняемый для всех запросов, поместите его там, и вы уверены, что он всегда будет выполнен. Пару лет назад я бы пошел с вариантом 1; теперь, когда я использую MVC и Frameworks, я всегда выбираю вариант 2.
Действительно, это «рамки, которые стоит использовать?» вопрос в маскировке.
Использование mod_rewrite для определения маршрутов URL-адресов выполняется быстро и легко (если вы понимаете регулярные выражения …), но ваш код приложения не обращается к URL-адресам, если вы не дублируете информацию где-то.
Обычно люди дублируют эту информацию много раз, не задумываясь об этом, жестко кодируя URL-адреса в ссылках в своих представлениях или в переадресации. Это действительно беспорядочно и в один прекрасный день вызовет боль, когда вы решите изменить структуру URL вашего сайта на полпути через разработку. Вы обязательно пропустите один, и в конечном итоге с чем-то 404.
Использование компонента маршрутизации в вашем приложении (например, в Symfony ) означает, что вы можете прикреплять имена к вашим маршрутам, позволяя вам определять URL-адреса один раз и повторно использовать их много раз:
# apps/frontend/config/routing.yml homepage: url: / param: { module: default, action: index }
страница# apps/frontend/config/routing.yml homepage: url: / param: { module: default, action: index }
Это упрощает ссылку на страницы вашего сайта без повторения:
<?php echo url_for('@homepage') ?>
Используйте вариант №2 – почему? RewriteRules в .htaccess
– это мощный инструмент, но они некие статические . Я имею в виду, что вы не можете легко управлять, используя PHP (или что-то, что вы собираетесь использовать). Также .htaccess
не обеспечивает такую гибкость, но имеет некоторые преимущества (например: это немного быстрее).
Вариант №2 также нужен .htaccess
как вы заметили, но в большинстве случаев RewriteRule
принимает следующий вид:
RewriteRule (.\*) index.php
Где index.php
– ваш передний контроллер.
Наибольшее преимущество (ИМО) этой души состоит в том, что каждый маршрут описан в PHP (или любом другом, что вы используете), так что доступ к этим маршрутам, их изменение намного проще. Кроме того, эти маршруты могут использоваться не только для изменения URL в набор переменных, но и наоборот – для создания URL из набора переменных.
Я думаю, что следующий пример (из концепции Symfony) объяснит, о чем я говорю:
// apps/.../config/routing.yml - Describes routing rules post: url: /read/:id/:slug params: { module: blog, action: index } requirements: { id: \d+, slug: \w+ } // apps/.../modules/blog/templates/indexSuccess.php - template for index action <?php echo link_to($post['title'], '@post?id=' . $post['id'] . '&slug=' . $post['slug']); ?> //creates: <a href="/read/123/my-first-blog-post.html">My first blog post</a>
Теперь, когда вы меняете свой файл rounting.yml
и изменяете /read/:id/:slug
в /:slug_:id
все ваши ссылки в приложении превратятся в /my-first-blog-post_123.html
.
Выполнение таких и других вещей, когда вы используете вариант № 2, намного проще.
Насколько я вижу, любые возможные различия в производительности между этими методами действительно незначительны и релевантны только для действительно высокопотенциальных сайтов.
Я думаю, что нет «лучшей практики» как таковой, оба метода одинаково часто используются. Если ваша структура проекта позволяет это сделать, и вы больше дома, разбираете URL-адрес в PHP (где остальная часть вашего проекта), размещайте все через один файл контроллера и позволяете вашему приложению обрабатывать все остальное.
Если производительность действительно важна, я подозреваю, что с Apache обрабатывать адреса быстрее, потому что между ними нет интерпретируемого языка. (У меня нет жестких данных для этого, хотя). Но, как я уже сказал, вы, вероятно, лучше всего выбираете, какая из них будет наиболее удобной для вас в долгосрочной перспективе.
Чистые симпатичные URL-адреса, как представляется, предоставляются популярной системой управления контентом на основе PHP Drupal с использованием правил modrewrite в .htaccess и подключаемых модулях PHP Drupal, таких как path и pathauto.
Учитывая успех и популярность этого инструмента – и его способность работать на самом скромном общем хостинге, я думаю, что это будет ваш ответ.