使用PHP“漂亮网址”框架的网站网址

时间:2010-06-11 13:58:32

标签: php frameworks url-rewriting url-routing

我一直在尝试轻量级的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框架的“常见”问题吗? (看来会是这样)

3 个答案:

答案 0 :(得分:2)

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

例如在Symfony中,这看起来像是:

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

然后,路由系统会将此反向解析为相对于您在配置中设置的任何根的URL。

答案 1 :(得分:2)

简单的替代方案是使用&lt; base href =“http://example.org/your/project/index”/&gt;在您的页面模板&lt; head&gt;中。但这基本上就像生成完整的URL一样。是的,它也适用于XHTML,仍然在HTML5中。

答案 2 :(得分: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