mod_rewrite $ _GET

У меня есть 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 используя разделитель / в качестве разделителя и вытащил первый элемент в качестве регистра.

Код перезаписи имеет преимущество при работе с именами файлов и именами каталогов.