2010-06-11 192 views
1

我一直在尝试轻量级NiceDog PHP路由框架,它的路线是这样的:网站的网址

R('entries/(?<id>\d+)') 
    ->controller('Entries_Controller') 
    ->action('show') 
    ->on('GET') 

现在.htaccess文件设置为做到这一点重定向,像这样:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

我的问题是,当我想要一个URL到某个地方,似乎不可能这样做。

说我要求entries/5网页,该网页上我想链接到另一个项目entries/6

<a href="entries/6">Next Entry</a> 

这解析为http://localhost/folder/to/project/entries/5/entries/6
不是我想要的地址。

该href /entries/6将链接到http://localhost/entries/6
也不是我想要的。

要解决这个问题,我创建了一个函数来处理这个问题:

function url($route) { 
    return "http://localhost/folder/to/project/$route"; 
} 

所以我现在可以写

<a href="<?= url('entries/6') ?>">Next Entry</a> 

现在链接到http://localhost/folder/to/project/entries/6,这正是我想要的。

但是,我必须这样做,因为每个现场链接,它似乎可以有一个更好的解决方案,不涉及外部创建的URL。

有没有“更好”的方法来解决这个问题?这是PHP框架的“常见”问题吗? (看来这将是)

回答

2

容易的选择是在您的页面模板<头>中使用< base href =“http://example.org/your/project/index”/ >。但这基本上就像生成完整的URL。是的,它也适用于XHTML,并且仍然在HTML5中。

0

你可以使用:

RewriteBase /folder/to/project/ 
在htaccess文件

使

RewriteEngine On 
RewriteBase /folder/to/project/ 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

+0

我试过了。它没有什么不同,因为浏览器是解决URL的问题。 – 2010-06-11 14:49:06

2

我不知道NiceDog但其他框架我已经使用了一个内置函数,可以将路由转换为相应的URL。

例如在Symfony的,这将是这个样子:

<a href="<?php echo url_for('entries/show?entry=5') ?>">Link Text</a> 

然后路由系统将反向解析成相对于您的配置设置的任何根URL这一点。

+0

这就是我说我想解决我的问题。 – 2010-06-11 14:50:08

+0

你也问过它是否在框架中很普遍:是的。 – 2010-06-11 14:56:19