2014-06-04 3 views
2

Yii каркас работает с путями формы http://foo.bar/index.php/foo/bar/baz.Как работает конкретный переписывающий файл?

Существует article, который рассказывает, как скрыть index.php с помощью mod_rewrite

RewriteEngine on 

# if a directory or a file exists, use it directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

# otherwise forward it to index.php 
RewriteRule . index.php 

The probles в том, что я не понимаю, как это переписывание работает при перезаписи http://foo.bar/foo/bar/baz

  1. переписывания двигатель получает foo/bar/baz

  2. . матчи foo/bar/baz

  3. Поскольку 2 верно два условия проверяются также, и они соответствуют

  4. foo/bar/baz заменяется index.php

  5. Следующая итерация переписывания не изменяет путь, так как файл фактически существует, и первое условие не соответствует

  6. Внутренняя переадресация на index.php выполняется

Что я не могу получить, то почему я вижу страницу http://foo.bar/index.php/foo/bar/baz, когда перенаправление производится на http://foo.bar/index.php?

ответ

2

Ok Причина этого проста. Если вы переписываете новое место, весь URL-адрес и все части запроса устанавливаются относительно нового местоположения файла. Поэтому во время вашей первой итерации файл не существует, и поэтому весь путь устанавливается относительно index.php.

подробно переписывание может сделать две вещей:

  1. сопоставить URL в файл
  2. перенаправлять на всех новые URL

первый является переназначить и поэтому NO NEW REQUEST , это то, что мы здесь используем. старый запрос получает сопоставление с index.php, и поэтому ваш ответ: no, используется тот же запрос. Если мы перенаправляем URL (хотя бы на том же сервере или нет), новый запрос запускается. См. Вводный текст здесь: http://httpd.apache.org/docs/current/mod/mod_rewrite.html

После этого вызывается index.php (шаблон-контроллер-регулятор), а yii использует путь и параметры запроса, чтобы найти соответствующий контроллер и действие. можно легко сделать следующим образом:

<?php 
//remove slashes 
$str = trim($_SERVER['REQUEST_URI'], '/'); 
//remove index 
$str = trim($str, 'index.php'); 
//remove slashes 
$str = trim($str, '/'); 

//get parts 
$urlParts = explode('/', $str); 

//fill vars 
$module  = count($urlParts) == 2 ? $urlParts[0] : null; 
$controller = count($urlParts) == 2 ? $urlParts[0] : $urlParts[1]; 
$action  = count($urlParts) == 2 ? $urlParts[1] : $urlParts[2]; 

//call controller/action via reflection HERE 

Если yii находит три стороны, он ищет модуль/контроллер/действие. если два найдены, он ищет контроллер/действие. Параметры запроса передаются соответствующим функциям-параметрам действия.

et voilà ... но вернемся к вашему вопросу: действительно просто прочитайте о том, как реализуется шаблон front-controller в php. вы найдете много очень подробных ответов на google.

просто скажите мне, если вам нужно больше деталей!

+0

немного уточнил код ... это действительно просто для того, чтобы дать вам представление о том, как это можно сделать! конечно, вы будете беспокоиться о неправильном количестве деталей и т. д., но это не является предметом этого ответа. Надеюсь, поможет :)! – PLM57

+0

Создает ли Apache новый HTTP-запрос на «http: // foo.bar/index.php» при внутреннем перенаправлении? Если да, то как 'index.php' знает исходный путь' foo/bar/baz'? – Kolyunya

+0

Меня интересует, что на самом деле происходит * до того, как выполняется скрипт php. Является ли Apache новым HTTP-запросом внутренним или он хранит все HTTP-заголовки из исходного запроса и передает их в новый файл? – Kolyunya

Смежные вопросы