2010-06-29 3 views
3

Я запускаю PHP на общем веб-сервере Apache. Я могу редактировать файл .htaccess.Имитировать структуру файла с помощью PHP

Я пытаюсь имитировать структуру файлового файла, которая на самом деле отсутствует. Например, я хотел бы для URL: www.Stackoverflow.com/jimwiggly на самом деле отображать www.StackOverflow.com/index.php?name=jimwiggly меня на полпути путем редактирования моего файла .htaccess в соответствии с инструкциями в этом посте: PHP: Serve pages without .php files in file structure:

RewriteEngine on 
RewriteRule ^jimwiggly$ index.php?name=jimwiggly 

Это работает хорошо, поскольку в строке URL по-прежнему отображается www.Stackoverflow.com/jimwiggly и правильная загрузка страницы, однако все мои относительные ссылки остаются неизменными. Я мог бы вернуться и вставить <?php echo $_GET['name'];?> перед каждой ссылкой, но похоже, что может быть лучший способ. Кроме того, я подозреваю, что весь мой подход может быть выключен, должен ли я идти об этом по-другому?

ответ

6

Я думаю, что лучший способ сделать это - перенять манипуляции с шаблонами стиля MVC с помощью URI, а не с параметрами.

В вашем использовании HTAccess как:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    #Rewrite the URI if there is no file or folder 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?/$1 [L] 
</IfModule> 

Тогда в вашем PHP скрипт вы хотите создать небольшой класс для чтения URI и разбить его на сегменты, такие как

class URI 
{ 
    var $uri; 
    var $segments = array(); 

    function __construct() 
    { 
     $this->uri = $_SERVER['REQUEST_URI']; 
     $this->segments = explode('/',$this->uri); 
    } 

    function getSegment($id,$default = false) 
    { 
     $id = (int)($id - 1); //if you type 1 then it needs to be 0 as arrays are zerobased 
     return isset($this->segments[$id]) ? $this->segments[$id] : $default; 
    } 
} 

Использование как

http://mysite.com/posts/22/robert-pitt-shows-mvc-style-uri-access

$Uri = new URI(); 

echo $Uri->getSegment(1); //Would return 'posts' 
echo $Uri->getSegment(2); //Would return '22'; 
echo $Uri->getSegment(3); //Would return 'robert-pitt-shows-mvc-style-uri-access' 
echo $Uri->getSegment(4); //Would return a boolean of false 
echo $Uri->getSegment(5,'fallback if not set'); //Would return 'fallback if not set' 

Сейчас в MVC Там обычно как http://site.com/controller/method/param но в не MVC приложении Style вы можете сделать http://site.com/action/sub-action/param

Надеются, что это помогает вам двигаться вперед с приложением.

+0

+1 Или еще лучше использовать MVC;). –

+0

Да, я бы объяснил это ему, но, похоже, он уже наполовину бросил свое приложение, так что просто дал наилучший ответ, не перекодируя все приложение. – RobertPitt

+0

@RobertPitt - Да, я собрал этот сайт еще в 2004 году, и его развитие с течением времени, если бы мне пришлось повторять это снова, я бы использовал фреймворк. Но начиная с того, где он сейчас, что-то меньшее влияние, как это, будет работать лучше. Большое спасибо. –

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