Имитация структуры файлов с помощью PHP - PullRequest
3 голосов
/ 30 июня 2010

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

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

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

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

1 Ответ

7 голосов
/ 30 июня 2010

Я думаю, что лучший способ сделать это - принять манипулирование URL-адресом в стиле 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 вы можете сделать http://site.com/action/sub-action/param

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

...