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