簡體   English   中英

Apache mod_rewrite:URL段未更新

[英]Apache mod_rewrite: URL slug not updating

關於mod_rewrite有一些SO問題,例如herehere ,但是到目前為止,我找不到適合我的示例的問題。

我有一個Apache網絡服務器,在根目錄var/www/html運行我的PHP網站。 /var/www/html/news我有一個.htaccess文件,該文件將用於將難看的$ _GET填充的URL字符串轉換為SEO友好的URL。

我當前的網址如下所示:

https://mywebsite.com/news/article.php?id=2&title=myfirstarticle

我希望我的網址看起來像這樣:

https://mywebsite.com/news/2/myfirstarticle

這是我的.htaccess文件 ,當前正在重定向到目標url結構。

RewriteEngine on 
RewriteRule ^([^/]*)/([^/]*)$ /article.php?id=$1&title=$2

到目前為止,我的URL尚未更改為SEO友好URL,我缺少什么?

您需要處理兩個方向:外部重定向和內部重寫:

RewriteEngine on 

RewriteCond %{QUERY_STRING} (?:^|&)id=(\d+)&title=([^&]+)(?:&|$)
RewriteRule ^article.php$ /news/%1/%2 [R=301]

RewriteRule ^([^/]+)/([^/]+)$ /article.php?id=$1&title=$2 [END]

一個好主意是從302臨時重定向開始,然后在確定一切都已正確設置之后,才將其更改為301永久重定向。 這樣可以防止在嘗試時緩存問題...

如果您使用上述規則收到內部服務器錯誤(http狀態500),則很可能是您運行了非常舊版本的apache http服務器。 在這種情況下,您將在http服務器錯誤日志文件中看到對不支持的[END]標志的明確提示。 您可以嘗試升級或使用舊的[L]標志,在這種情況下它可能會起作用,盡管這在一定程度上取決於您的設置。

此規則將在http服務器主機配置或動態配置文件(“ .htaccess”文件)中同樣起作用。 顯然,重寫模塊需要加載到http服務器內部並在http主機中啟用。 如果使用動態配置文件,則需要注意在主機配置中完全啟用了它的解釋,並且該解釋位於主機的DOCUMENT_ROOT文件夾中。

還有一個一般性說明:您應該始終喜歡將此類規則放在http服務器主機配置中,而不要使用動態配置文件(“ .htaccess”)。 這些動態配置文件增加了復雜性,通常是導致意外行為,難以調試的原因,並且確實降低了http服務器的速度。 僅當您無法訪問真正的http服務器主機配置(閱讀:真正便宜的服務提供商)或堅持編寫自己的規則的應用程序(這顯然是安全的噩夢)時,才提供它們作為最后的選擇。

嘗試以下htaccess規則:

RewriteEngine On
RewriteRule ^news/([^/]*)/([^/]*)$ /news/article.php?id=$1&title=$2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM