У меня есть FrontController
ожидающий два параметра $_GET
:
controller action
Типичный вызов сайта будет выглядеть следующим образом:
http://foo.bar/index.php?controller=start&action=register
Я хочу, чтобы пользователь мог посетить этот сайт по следующему URL:
http://foo.bar/start/register
Что я пробовал:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.+)/(.+)$ index.php?controller=$1&action=$2 [L,QSA] </IfModule>
Так как это дает мне 404 Ошибки, это не работает.
Сам mod_rewrite
включен на сервере.
Сообщение .htaccess
вы разместили, работает для меня:
// GET /cont1/action1 print_r($_GET); /* output Array ( [controller] => cont1 [action] => action1 ) */
Вы можете попробовать абсолютный путь к index.php
а не относительный.
Независимо от того, что это регулярное выражение приведет к:
// GET /cont1/action1/arg1 print_r($_GET); /* output Array ( [controller] => cont1/action1 [action] => arg1 ) */
Вам будет лучше:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L] </IfModule>
И имея ваш index.php
разделите $_GET['url']
на контроллер, действие, args и т. Д. …
Есть две части, чтобы получить эту работу. Если вы работаете с PHP и Apache, механизм перезаписи должен быть доступен на вашем сервере.
В вашей папке пользователя поместите файл с именем .htaccess
с этим содержимым:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . index.php [L]
Затем ваш index.php
вы можете использовать переменную сервера REQUEST_URI
чтобы увидеть, что было запрошено:
<?php $path = ltrim($_SERVER['REQUEST_URI'], '/'); echo $path; ?>
Если кто-то запросил /start/register
, то, предполагая, что весь приведенный выше код находится в корне html, переменная $path
будет содержать start/register
.
Я бы использовал функцию explode в $path
используя разделитель /
в качестве разделителя и вытащил первый элемент в качестве регистра.
Код перезаписи имеет преимущество при работе с именами файлов и именами каталогов.