mod_rewrite $ _GET

时间:2012-05-16 19:26:37

标签: php regex apache mod-rewrite

我有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本身已在服务器上启用。

2 个答案:

答案 0 :(得分: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']分成控制器,动作,参数等......

答案 1 :(得分:0)

要使这项工作有两个部分。如果您正在使用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上的爆炸功能使用/作为分隔符,并将第一个元素作为寄存器。

重写代码具有处理文件名和目录名的好处。