如題,客戶(hù)說(shuō)希望URL地址就是發(fā)布文章的標(biāo)題。這是一個(gè)奇怪的需求。
為什么說(shuō)奇怪了,
標(biāo)題變化帶來(lái)的URL變化問(wèn)題
如果標(biāo)題改了,URL也得改,導(dǎo)致舊URL失效,造成死鏈,影響SEO,除非做好301重定向。
標(biāo)題過(guò)長(zhǎng)或含特殊字符影響URL
標(biāo)題可能過(guò)長(zhǎng),含空格、標(biāo)點(diǎn)符號(hào)等,需要做良好slug化處理,否則URL會(huì)顯得冗長(zhǎng)或混亂。
重復(fù)標(biāo)題可能導(dǎo)致重復(fù)URL
不同文章標(biāo)題重復(fù)時(shí),URL沖突,需要額外機(jī)制避免重復(fù)(如加數(shù)字后綴)。
隱私及安全考慮
有些標(biāo)題可能暴露敏感信息,直接作為URL可能帶來(lái)風(fēng)險(xiǎn)(視內(nèi)容而定)。
URL穩(wěn)定性
URL最好是穩(wěn)定不變的,頻繁根據(jù)標(biāo)題變動(dòng)會(huì)影響SEO權(quán)重的積累。
都2025年了,SEO對(duì)純技術(shù)上的要求并不高,內(nèi)容為王的時(shí)候,還在去做技術(shù)層面的東西,實(shí)在沒(méi)有必要。
我的一個(gè)網(wǎng)站用7天時(shí)間就上了谷歌首頁(yè),至今已經(jīng)5年左右了。排名沒(méi)有掉過(guò)。當(dāng)時(shí)做的時(shí)候從來(lái)沒(méi)有去考慮過(guò)SEO方面的問(wèn)題,只是精心設(shè)計(jì)了一下首頁(yè)的TDK,然后連續(xù)發(fā)了一周的文章,排名就上去了,后面就再也沒(méi)有管過(guò)那個(gè)網(wǎng)站,排名一直在首頁(yè)前三。
甚至從很多所謂的SEO優(yōu)化者的角度來(lái)看,我的那個(gè)站可能SEO打分的話(huà),最多40分,因?yàn)槲以谧瞿莻€(gè)站的時(shí)候,時(shí)間很匆忙,做網(wǎng)站只用了一天,然后什么title, Alt, h2標(biāo)簽,這些在SEO人員眼中很神奇的東西,我完全沒(méi)有考慮過(guò)。
話(huà)不多說(shuō)了,開(kāi)工。
文章詳情的話(huà)是由:ContentController.php控制器管理的。所以我們打開(kāi)這個(gè)文章,添加了個(gè)過(guò)濾的函數(shù)。
/*** 將字符串轉(zhuǎn)換為URL友好的slug格式 20250626 ,小寶*/ private function slugifyadd($text) { // 先把 HTML 實(shí)體轉(zhuǎn)換為對(duì)應(yīng)字符 $text = html_entity_decode($text, ENT_QUOTES | ENT_HTML5, 'UTF-8'); // 替換非字母數(shù)字字符為橫線(此時(shí)單引號(hào)是字符 ',會(huì)被替換成橫線) $text = preg_replace('/[^A-Za-z0-9]+/u', '-', $text); // 合并多個(gè)橫線為一個(gè) $text = preg_replace('/-+/', '-', $text); // 去掉首尾橫線 $text = trim($text, '-'); // 轉(zhuǎn)成小寫(xiě)(可選) // $text = strtolower($text); return $text ?: 'n-a'; }
然后我們?cè)谖恼略黾拥暮瘮?shù)中
// 文章增加 public function add() { if ($_POST) { // 獲取數(shù)據(jù) $scode = post('scode'); $subscode = post('subscode'); $title = post('title'); $titlecolor = post('titlecolor'); $subtitle = post('subtitle'); $filename = trim(post('filename'), '/'); $author = post('author'); $source = post('source') ?: '本站'; $outlink = post('outlink'); $date = post('date'); $ico = post('ico'); $pics = post('pics');
可以看到有這樣一行代碼, filename就是網(wǎng)站的URL地址。
$filename = trim(post('filename'), '/');
然后我們將他修改成:
$filename = $this->slugifyadd($title);
在后面的文章修改中也有同樣的一處。
// 文章修改 public function mod()
在這個(gè)函數(shù)中,也同樣修改一下。
這樣就實(shí)現(xiàn)了發(fā)布新聞或者修改文章的時(shí)候,URL地址就自動(dòng)獲取標(biāo)題并過(guò)濾掉符號(hào)后用橫線連接成URL。
如果我們想保留這個(gè)功能,又想自定義URL怎么辦呢?
我們可以改成這樣
// filename允許用戶(hù)手動(dòng)填寫(xiě),若為空則用title生成slug $filename = trim(post('filename'), '/'); if (!$filename && $title) { $filename = $this->slugifyadd($title); // 調(diào)用同一個(gè)函數(shù) }
這樣的話(huà),如果用戶(hù)發(fā)布文章的時(shí)候,可以自定義URL地址,此時(shí)就不會(huì)讀取標(biāo)題作為URL了。
如果需要用標(biāo)題作為URL就需要?jiǎng)h除掉URL中的自定義地址。
這就有一個(gè)問(wèn)題就是,如果我發(fā)布了一篇文章,他會(huì)生成一個(gè)URL地址并寫(xiě)入到filename中,當(dāng)我想必這篇文章的時(shí)候,標(biāo)題我是修改了,實(shí)際上URL處會(huì)有這前的標(biāo)題生成的URL,此時(shí)如果不刪除掉之前生成的URL,那么修改文章后,就不會(huì)生成新的標(biāo)題URL,就還會(huì)是原來(lái)的標(biāo)題生成的URL。
而上面一開(kāi)始的那種方法 ,就是不管是新增和修改,都是讀取最新的標(biāo)題作為URL的。