賞金將在 5 天后到期。此問題的答案有資格獲得 50聲望賞金。 Seb正在從有信譽的來源尋找答案。
我正在嘗試重寫以下 URL,但 URL 沒有改變,沒有錯誤。
當前網址:
https://example.com/test/news/?c=value1&s=value2&id=9876
預期網址:
https://example.com/test/news/value1/value2
我的 .htaccess
RewriteEngine On
RewriteRule ^test/news/([^/]*)/([^/]*)$ /test/news/?c=$1&s=$2&id=1 [L]
uj5u.com熱心網友回復:
但我看過很多文章,其中的 url
example.com/display_article.php?articleId=my-article可以重寫example.com/articles/my-article,例如.htaccess
但是這里重要的一點(我認為您遺漏了)是 URL 必須已經在您的應用程式內部進行了更改 - 在您的所有內部鏈接中。一個常見的誤解是.htaccess可以單獨使用來更改 URL 的格式。雖然.htaccess這是其中的重要部分,但它只是其中的一部分。
是的,您可以實作重定向.htaccess以從舊 URL 重定向到新 URL - 這對于保留 SEO(見下文)至關重要,但這對您的應用程式作業并不重要。如果您不首先更改內部鏈接中的 URL,則:
“舊” URL 仍然在 HTML 源代碼中公開。當用戶將滑鼠懸停在或復制鏈接時,他們會看到并復制“舊”URL。
每次用戶單擊您的一個內部鏈接時,他們都會從外部重定向到“新”URL。這對您的用戶來說很慢,對 SEO 不利(您永遠不應該鏈接到重定向的 URL)并且對您的服務器不利,因為它可能會使訪問服務器的請求數量翻倍(好的,301 快取在本地)。
參考@IMSoP對此參考問題的回答:
重寫規則不會使丑陋的 URL 變得漂亮,它們會使漂亮的 URL 變得丑陋
因此,一旦您將內部鏈接更改為“新”(預期)格式,例如。/test/news/value1/value2(或者應該是/test/news/value1/value2/id甚至/test/news/id/value1/value2?見下文),那么您可以執行以下操作...
RewriteRule ^test/news/([^/]*)/([^/]*)$ /test/news/?c=$1&s=$2&id=1 [L]
這在內部將請求從/test/news/<value1>/<value2>to重寫/test/news/?c=<value1>&s=<value2>&id=1。但是,這有幾個問題:
/test/news/本身不是一個有效的端點。這需要進一步重寫。也許您正在提供 DirectoryIndex 檔案(例如。index.php)?這對您來說可能看起來是無縫的,但這需要一個額外的內部子請求,并使規則依賴于配置的其他元素。您應該直接重寫處理請求的檔案。例如。/test/news/index.php?c=<value1>&s=<value2>&id=1(請記住,這對用戶完全隱藏)。您正在對
id=1引數進行硬編碼?每個 URL 都應該相同id嗎?還是應該在“新” URL 中傳遞(這是我所期望的)?代表什么id?如果這對 URL 的路由至關重要,那么id應該出現在 URL 路徑的前面,以防在復制/粘貼/共享時 URL 被意外截斷。如果
id需要,則需要在“新”URL 中傳遞。我們只有“新” URL 來路由請求,因此無法隱藏資訊。
因此,如果現在是“新” URL,/test/news/<id>/<value1>/<value2>那么重寫將需要改為:
# Rewrite new URLs to old/actual URL
# "/test/news/<id>/<value1>/<value2>" to "/test/news/?c=<value1>&s=<value2>&id=<id>"
RewriteRule ^test/news/(\d )/([^/] )/([^/] )$ /test/news/?c=$2&s=$3&id=$1 [L]
然后(可選*1)您可以實施外部重定向以保留 SEO。這適用于已將“舊” URL 或無法更新的第三方入站鏈接編入索引的搜索引擎 - 需要更正這些以通知搜索引擎更改并讓用戶使用“新”規范 URL -of-date 入站鏈接。
(*1如果您要更改現有 URL,則它不是“可選的”,但對于您的應用程式是否正常運行而言,它是可選的。)
此“重定向”在上述重寫之前進行:
# Redirect old URLs to the new "canonical" URL
# "/test/news/?c=<value1>&s=<value2>&id=<id>" to "/test/news/<id>/<value1>/<value2>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^c=([^&] )&s=([^&] )&id=(\d )
RewriteRule ^test/news/$ /$0%3/%1/%2 [QSD,R=301,L]
$0反向參考包含來自RewriteRule 模式的完整匹配,即。test/news/在這種情況下 - 這只是節省了重復。
%1和反向參考包含從前面的%2條件捕獲的值。IE。和URL 引數的值。%3csid
請注意,URL 引數/路徑段不應像您的原始指令(即。)中那樣是可選的。([^/]*)如果它們是可選的并且被省略,那么生成的 URL 就會變得不明確。例如。<value2>變成<value1>if<value1>被省略。
請注意,URL 引數必須按所述順序排列。如果您的“舊” URL 與這些引數以不同的順序(甚至與其他引數混合)不匹配,那么這可以用額外的復雜性來解釋。(在服務器端腳本中執行此重定向可能更容易,而不是.htaccess.)
檢查REDIRECT_STATUS環境變數的第一個條件確保我們只重定向直接請求,而不是通過以后的重寫重寫請求(否則會導致重定向回圈)。Apache 2.4 上的一個替代方法是使用該END標志來RewriteRule代替。
該QSD標志 (Apache 2.4) 會丟棄請求中的原始查詢字串。
您應該首先使用 302(臨時)重定向進行測驗,以避免潛在的快取問題,并且只有在您測驗一切都按預期作業后才更改為 301(永久)重定向。301 由瀏覽器持久快取,因此可能會使測驗出現問題。
概括
您的完整.htaccess檔案應如下所示:
Options -MultiViews FollowSymLinks
# If relying on the DirectoryIndex to handle the request
DirectoryIndex index.php
RewriteEngine On
# Redirect old URLs to the new "canonical" URL
# "/test/news/?c=<value1>&s=<value2>&id=<id>" to "/test/news/<id>/<value1>/<value2>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^c=([^&] )&s=([^&] )&id=(\d )
RewriteRule ^test/news/$ /$0%3/%1/%2 [QSD,R=301,L]
# Rewrite new URLs to old/actual URL
# "/test/news/<id>/<value1>/<value2>" to "/test/news/?c=<value1>&s=<value2>&id=<id>"
RewriteRule ^test/news/(\d )/([^/] )/([^/] )$ /test/news/?c=$2&s=$3&id=$1 [L]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/465398.html
