将查询字符串“?x = y”样式重写为“/ x / y”样式

时间:2010-05-26 19:15:25

标签: apache model-view-controller mod-rewrite url-routing

我有一个我从头开始构建的PHP MVC框架,它使用传统的domain.com/controller/action URL路由。虽然我目前正在路由器中处理以下转换,但我还是想在网址中将其替换为外观。

例如:

controller/action?filter=bank

变为:

controller/action/filter/bank

我已经对正则表达式进行了一些实验,但似乎找不到匹配。我也不确定如何使用RewriteCond重写它。

提前致谢。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

Zend Framework URL格式几乎与此相同,here's what they use

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

如果您的服务器端脚本是PHP,您可以使用它来获取URL部分:

$request_parts = explode('/', $_SERVER['REQUEST_URI']);
$controller = $request_parts[0];
$action = $request_parts[1];
// etc...

答案 2 :(得分:0)

根据您对我的其他答案的回复,我建议您使用JavaScript处理过滤器表单提交并在客户端创建“干净网址”请求。


修改

我最近在我的年/月选择器上为我的日历应用程序实现了这个。它使用jQuery / JavaScript来检测表单中的更改并编写“干净”的URL:

$(document).ready(function() {
    $('form.jumpform select').change(function() {
        $form = $(this).closest('form');
        window.location = $form.attr('action')
                + '/y/' + encodeURIComponent($form.find('select[name="y"]').val())
                + '/m/' + encodeURIComponent($form.find('select[name="m"]').val());
    });
});