我有FrontController
期待两个$_GET
参数:
controller
action
对该网站的典型调用如下所示:
我想要做的是允许用户通过以下网址访问此网站:
我尝试了什么:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.+)/(.+)$ index.php?controller=$1&action=$2 [L,QSA]
</IfModule>
因为这给了我404错误,所以它似乎不起作用。
mod_rewrite
本身已在服务器上启用。
答案 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
上的爆炸功能使用/
作为分隔符,并将第一个元素作为寄存器。
重写代码具有处理文件名和目录名的好处。