我需要将这样的 URL 重定向http://mysite.com/store/store-name
到http://mysite.com/stores/products/store-id
. 请注意,我需要从数据库中获取商店 ID。那么是否可以在 routes.php 中进行 db 操作?
在文档中,语法为 as $route['store/:any']
。如何获取这里提到的第二个参数的值:any
。
我需要将这样的 URL 重定向http://mysite.com/store/store-name
到http://mysite.com/stores/products/store-id
. 请注意,我需要从数据库中获取商店 ID。那么是否可以在 routes.php 中进行 db 操作?
在文档中,语法为 as $route['store/:any']
。如何获取这里提到的第二个参数的值:any
。
通过路由运行数据库查询实际上没有任何好的或简单的方法。但是,您可以在控制器功能的开头进行验证。
我想你store-name
是某种产品的蛞蝓?基本上,您可以验证值是否为数字,如果没有,则通过 slug 找到然后重定向。
配置/路由.php
$route["store/(.*)"] = 'stores/products/$1';
/* () and $1 together passes the values */
控制器/stores.php
/* Class etc. */
function products($mix) {
if (is_numeric($mix))
$int_id = $mix;
else {
$row = $this->get_where('products', array('slug' => $mix))->row();
$this->load->helper('url');
redirect("stores/products/{$row->id}");
}
/* Do stuff with the $int_id */
}
这假设您有:
store-name
CodeIgniter 路由一切皆有可能。这一切都在你编码它的方式。CI 中的路由非常灵活。除了标准 CI 通配符 (:any)(:num) 之外,您还可以使用正则表达式。如果需要,您甚至可以为路径变量添加前缀或后缀:
$route['store/(:any)'] = "redircontroller/redirfunction/$1";
// for instance the namelookup method of the mystores controller
$route['stores/products/(:any)'] = "mystores/namelookup/$1";
您可以通过在路由值中定义变量来获得第二个参数(以及第三个等),这些变量将传递给您定义的控制器方法。如果你的新网址中的“产品”也是一个变体,你应该在那里开始你的通配符表达式。您还可以使用 URI 类 ($this->uri->segment(n)) 从 url 中提取参数。
但是,您不会在 routes.php 中进行数据库操作。您在路由到的控制器中执行数据库操作。我的猜测是,您必须使用查询中 url 中使用的任何内容来匹配商店 ID。在任何情况下,您使用路由文件的路径都是用户将看到的路径。要进行重定向,您必须接受原始路径,然后将用户重定向到新路径,如下所示:
// in some controller that's attached to the original url
public function redirfunct($var){
$this->load->helper('url');
redirect(base_url('stores/products/' . $var));
}
我希望这可以帮助你。
我参加聚会可能有点晚了,但我可能有一个替代建议。
我将以下内容用于我的路线:
http://mysite.com/store/1/store-name
原因是...根据您的方法,如果您创建
http://mysite.com/store/store-name
但是在一段时间后(毫无疑问,Google 已将您的页面编入索引),您决定出于何种原因将商店名称更改为“Wonderful store name”,您自然会将链接更改为
http://mysite.com/store/wonderful-store-name
这会杀死您的 SEO 和任何索引链接。
我使用http://mysite.com/store/1/store-name的解决方案意味着您可以更改store-name
为您想要的任何内容,但它始终引用1
意味着用户仍将看到相关页面。
是的,这很简单,您只需要显示 ID 而不是名称,您必须像 storeName > Click to view details
使它成为
storeId> 点击查看详情
当您将参数传递给数据库时,更改 mysql 的检查,将其更改为 id 而不是 name ,这可能类似于“select yourRequiredColumn from table_name where id=".parameter."
谢谢