Вопрос по php, regex, apache – mod_rewrite $ _GET

1

у меня естьFrontController ожидая двух$_GET Титулы:

controller
action

Типичный звонок на сайт будет выглядеть так:

http://foo.bar/index.php?controller=start&action=register

Я хочу разрешить пользователю посещать этот сайт по следующему адресу:

http://foo.bar/start/register

Что я пробовал:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.+)/(.+)$ index.php?controller=$1&action=$2 [L,QSA]
</IfModule>

Так как это дает мне 404 ошибки, это не похоже на работу.

mod_rewrite Сам по себе включен на сервере.

По сути, это не ответ, но уже есть много фреймворков. Используйте один. Symfony2 например. PorridgeBear
Где вы разместили правила перезаписи - httpd.conf или .htaccess? Если он находится в файле .htaccess, то какой? Один внутри корневого каталога или где-то внутри подпапки? Salman A
.htaccess, в подпапке. Весь проект находится в подпапке, поэтому реальный URL выглядит примерно так:foo.bar/project iceteea

Ваш Ответ

2   ответа
2

.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'] в контроллер, действие, аргументы и т.д ...

0

Есть 2 части, чтобы заставить это работать. Если вы работаете с 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.

Я бы использовал функцию разнесения на$path с использованием/ в качестве разделителя и вытащить первый элемент в качестве регистра.

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

Похожие вопросы