是否可以使用Route :: Connect路由到查询字符串参数?

时间:2013-06-25 19:55:53

标签: php .htaccess cakephp

我正在尝试替换像

这样的网址
mysite.com/uploads:27 

成  mysite.com/uploads/upload?upload=27

我原来的计划是使用像这样的.htaccess文件:

RewriteRule ^upload:(.+) /uploads/upload?upload=$1 [L]

然而,我发现这不是最好的主意,因为蛋糕有几个.htaccess文件。无论如何,规则不起作用。

所以我去了Cake的路线。但是,我似乎无法弄清楚如何使用查询字符串参数路由到URL。

我试过了:

Router::connect('/upload::upload',
    array('controller' => 'uploads',
          'action' => 'upload',
    '?' => array('upload' => '23')
          )
    );

但是,我不认为Router :: connect是这样工作的。没有查询字符串数据传递给上传控制器。鉴于我在文档中读到的内容,我没想到这会起作用。

http://book.cakephp.org/2.0/en/development/routing.html “路由是一种将URL映射到控制器操作的功能” - 我猜这意味着查询字符串参数不适用于这种情况。

那么有什么方法可以让路线按照我试图使用的方式行动.htaccess? 我很惊讶没有办法做到这一点,因为使用.htaccess缩短查询字符串是一项常见任务。

像本教程一样显示:http://www.elated.com/articles/mod-rewrite-tutorial-for-absolute-beginners/ 或apcahe docs: http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

注意:我很清楚我想要的URL映射(尤其是带冒号的upload:27语法)是针对蛋糕约定的。我的应用程序没有配置为像mysite.com/uploads/upload/27那样,因为文档建议我应该这样做。我更愿意按照我在第一个地方想象的方式弄清楚如何做到这一点。

1 个答案:

答案 0 :(得分:0)

如果重定向没问题,那么应该这样做:

RewriteRule ^upload:(\d+)$ /uploads/upload?upload=$1 [R=302,L]

使用位于.htaccess的{​​{1}}文件,您应该感觉良好。见这个例子:

app/webroot/

这是原始<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f RewriteRule .* - [S=2] RewriteRule ^upload:(\d+)$ /uploads/upload?upload=$1 [R=302,L] RewriteRule ^(.*)$ index.php [QSA,L] </IfModule> 文件,经过修改以使重写条件(检查所请求的目标是否是实际存在的文件或文件夹)适用于最后两个重写规则。如果条件为真,则跳过最后两条规则(.htaccess)。

另见Multiple RewriteRules for single RewriteCond in .htaccess