Я пишу простой метод для сопоставления маршрутов к файлам, и у меня есть два способа сделать это.
Первый, и я предполагаю, что используется большинством фреймворков, использует переменную $ _SERVER ['REQUEST_URI'], чтобы извлечь все после index.php:
RewriteRule ^(.*)$ index.php [QSA,L]
Второй способ используется в Drupal, и маршрут просто передается как строка запроса.
RewriteRule ^(.*)$ index.php?q=$1 [QSA,L]
Теперь «Drupal way» мне кажется намного проще. С помощью другого метода вам придется использовать «explode» как для $ _SERVER ['REQUEST_URI'], так и для $ _SERVER ['SCRIPT_NAME'], а затем использовать что-то вроде array_diff_assoc для удаления имени сценария и имени подкаталога, если оно есть. Это не так много работает, но если с помощью Drupal вы можете просто извлечь значение $ _GET ['q'], почему никто этого не делает? Каковы недостатки, если таковые имеются?
Благодарю.
Недостатком использования параметра q
является отсутствие URL-адреса, URL-адрес которого будет выглядеть …
http://domain.com/?q=something
… в отличие от уборщика (ИМО) …
http://domain.com/index.php/something
Нет никакого огромного преимущества или недостатка в том или ином способе, когда URL-адрес будет переписан. Тем не менее, я укажу все, включая и после того, как окончательная косая черта хранится в _SERVER[PATH_INFO]
, поэтому разбор URI запроса мне не нужен.
Причина, по которой используется более короткая методика URL-адреса, заключается в том, чтобы использовать более чистую технику и лучший SEO, который исходит от нее. Поисковые системы считают, что эти два URL-адреса должны быть «одинаковыми»:
У меня нет хорошего объяснения, вот некоторые ссылки с некоторыми действительно хорошими сведениями об этом:
Теперь некоторые люди используют более короткий URL-адрес по-разному, но именно так я нашел, что они работают лучше для меня:
В .htaccess
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
В index.php (или в другом файле php)
if(isset($_GET['route']) && $_GET['route'] != NULL && strlen($_GET['route']) > 0) { $split = explode('/', $_GET['route']); for($i=1; $i <= count($split)-1; $i++) { $_GET[$i] = $split[$i]; } }
Это позволяет вам использовать $ _GET ['1'] (или $ _GET [1]) и все последующие номера.
URL-адрес выглядит следующим образом:
http://www.domain.com/?b=something
становится
http://www.domain.com/something
http://www.domain.com/?b=something&a=hello&c=blah
становится
И тогда параметры могут быть доступны через:
$_GET[1] = "something"; $_GET[2] = "hello"; $_GET[3] = "blah";
Надеюсь, это поможет!