Я развиваю свой первый сайт 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 }
Это делает его очень легко связать на страницах вашего сайта, не повторяя себя:
<?php echo url_for('@homepage') ?>
Использовать вариант № 2 - Почему? Переписать в .htaccess
- это мощный инструмент, но они какой-то статический . Я имею в виду, что вы не можете легко управлять, а затем использовать PHP (или все, что вы собираетесь использовать). Кроме того .htaccess
не обеспечивает столько гибкости, но имеет некоторые преимущества (например: это немного быстрее).
Вариант № 2 также нужен .HTACCESS
, как вы заметили, но в большинстве случаев Rewriterule
принимает следующую форму:
RewriteRule (.\*) index.php
где index.php
Ваш передний контроллер.
Наибольшее преимущество (IMO) этой SULLION заключается в том, что каждый маршрут описан в PHP (или что вы используете), поэтому доступ к этим маршрутам, модифицируя их намного проще. Кроме того, эти маршруты могут быть использованы не только для изменения URL в набор переменных, но и противоположным образом - для создания URL из набора переменных.
Я думаю, что следующий пример (из Symfony Framework) объяснит, о чем я говорю:
// 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, намного проще.
Насколько я вижу, любые возможные различия в производительности между этими методами действительно MISCULE и актуальны только на самом деле, действительно высокопоставленные места.
Я думаю, что нет «лучшей практики» как таковой, оба метода одинаково используются. Если ваша структура проекта позволяет ей, и вы больше дома с анализом URL в PHP (где остальная часть вашего проекта), поместите все через один файл контроллера, и позвольте вашему приложению обрабатывать остальные.
Если производительность на самом деле существует сущность, я подозреваю, что для обработки Apache адреса быстрее, потому что между ними нет интерпретированного языка. (У меня нет жестких данных для этого, хотя). Но, как я уже сказал, вы, вероятно, лучше всего выбрать, что будет наиболее удобно для вас в долгосрочной перспективе.
Чистые симпатичные URL-адреса, по-видимому, оказываются популярным системой управления контентом PHP-скрипта, используя комбинацию .
Учитывая успех и популярность этого инструмента - и его способность работать на самом скромном общем хостинге, я думаю, что это будет ваш ответ.