Я запускаю 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'];?>
Перед каждой ссылкой, но похоже, что может быть лучший способ. Кроме того, я подозреваю, что весь мой подход может быть выключен, должен ли я идти об этом по-другому?
Я думаю, что лучший способ сделать это – принять манипуляции с 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 Script вы хотите разработать небольшой класс для чтения 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
Надеюсь, это поможет вам двигаться вперед с вашим приложением.