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