2

我正在尝试替换一个 URL,例如

mysite.com/uploads:27 

进入 mysite.com/uploads/upload?upload=27

我最初的计划是使用这样的 .htaccess 文件:

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

但是,我发现这不是最好的主意,因为 cake 有几个 .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 文档: http ://httpd.apache.org/docs/2.0/misc/重写指南.html

注意:我很清楚我想要的 URL 映射(尤其是带有冒号的 upload:27 语法)是违反蛋糕约定的。我的应用程序未配置为使用 mysite.com/uploads/upload/27 之类的内容,正如文档建议我应该做的那样。我更愿意按照我最初想象的方式弄清楚如何做到这一点。

4

1 回答 1

0

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

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

使用.htaccess位于的文件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文件,经过修改以使重写条件(检查请求的目标是否是实际存在的文件或文件夹)适用于最后两个重写规则。[S=2]如果条件为真,这通过跳过最后两个规则 ( ) 来工作。

另请参阅.htaccess 中单个 RewriteCond 的多个 RewriteRules

于 2013-06-27T14:23:52.903 回答