Лучше ли обращаться с дружественными / чистыми / красивыми URL-адресами с помощью mod_rewrite или с языком, подобным PHP?

Я разрабатываю свой первый 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 

Ясно, что это все непроверенный «воздушный код», но вы поняли суть.

  • Является ли один из этих двух способов более серьезным, чем другой? Предположительно, mod_rewrite работает медленнее, так как я буду вынужден использовать файлы .htaccess для этого.
  • Существуют ли серьезные недостатки для любого из этих подходов?
  • Есть ли «лучшая практика» для такого рода вещей, или это то, что каждый разработчик стремится решить для себя? Я знаю, что WordPress использует вариант два (хотя это было больше проблем, чем стоило, когда я точно изучил, как они это сделали).

Вариант 1 (.htaccess и несколько .php-файлов) часто использовался «в прошлом»; теперь, я вижу вариант 2 (каждый запрос, проходящий через один .php-файл), используется намного больше.

Основными преимуществами, которые я вижу в варианте 2, являются:

  • вы можете добавлять / изменять любой URL-адрес без изменения какого-либо физического файла, например .htaccess
    • что означает, что формат URL-адресов можно настроить в разделе администратора вашего приложения, например
  • у вас есть только одна точка входа в ваш PHP-код.
    • что означает, что все идет, хотя index.php : если вам нужен какой-то код, выполняемый для всех запросов, поместите его там, и вы уверены, что он всегда будет выполнен.
    • Например, это много используется с инфраструктурами MVC.

Пару лет назад я бы пошел с вариантом 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.

Учитывая успех и популярность этого инструмента – и его способность работать на самом скромном общем хостинге, я думаю, что это будет ваш ответ.