我的laravel路线有问题。
我在php中有一个旧商店,我在laravel中重写它。问题在于产品路线。它们已被索引(谷歌),现在我无法访问它们。
网址结构是:
http://mydomain/product/{productName}-{productID}.html
在laravel中,我创建了一条生成相同结构的路线:
Route::get('/product/{productName}-{id}.html', 'ProductController@index')->name('product');
问题是,当旧网址在productName中包含点(。)时,它返回404(不会进入控制器) - 因为新路由中的(.html)。
如果从路径中删除(.html)我在控制器中获取请求,但是如何才能更好地创建URL的结构?
/{productName}-{productID}.html
更新
生成productName时,我使用php函数使其成为seo(productName):
public function makeSeoLink($string)
{
// trim the string
$string = trim($string);
// remove all diacritics
$string = str_ireplace(array("â", "î", "ă", "ș", "ț"), array("a", "i", "a", "s", "t"), $string);
// remove all non alphanumeric characters except spaces
$clean = preg_replace('/[^a-zA-Z0-9\s]/', '', strtolower($string));
// replace one or multiple spaces into single dash (-)
$clean = preg_replace('!\s+!', '-', $clean);
return $clean;
}
生成网址时:
route('product', array(makeSeoLink($p->Name), $p->id));
答案 0 :(得分:0)
对于Laravel,路由有一个where
子句。所以你可以添加一个扩展名,并在where子句中指定它。这是一个例子。
Route::get('/product/{productName}-{id}{extension}', 'ProductController@index')->name('product')->where('extension', '(?:.html)?');
我从here得到了这个答案。
其他有用的链接
答案 1 :(得分:0)
由于产品名称可以包含破折号( - ),您必须使用以下内容:
<强>路线强>
Route::get('/product/{productDetails}','ProductController@index')->name('product');
索引功能
function index(){
$segment = Request::segment(2);
$segment = str_replace('.html', '', $segment);
$list = explode('-',$segment);
$id = end($list);
array_pop($list);
$text = implode("-",$list);
return [$id,$text];
}