[英]Keep redirecting old realurl urls after migrating to TYPO3 9+
我想使用過期 url 的 realurl memory 為升級到 TYPO3 9+ 的站點生成 301 並避免 404。
比如TYPO3 9之前,抓取/my-old-page
重定向到/my-new-page
,因為/my-old-page
還在realurl數據庫表中。 現在,由於遷移到 TYPO3 9,獲取/my-old-page
會拋出 404。
TYPO3 9 發布了一個升級向導,它將 realurl 頁面路徑/別名轉換為 slugs,但不會將 realurl 的過期頁面路徑/別名轉換為sys_redirect
。
保持 realurl memory 重定向的最佳策略是什么:
我所說的“最佳策略”是指:
感謝您的見解!
我的第二個解決方案(我正在使用 - 稍微修改 - 在生產中)是 TYPO3:
PageErrorHandlerInterface
為 404 創建頁面錯誤處理程序。檢查 URL 的 realurl 表。如果命中,則重定向到新的 URL。這有以下優點(到 TYPO3 重定向擴展):
存儲庫\路徑映射存儲庫:
public function findPageidForPathFromRealurl(string $path, int $languageId) : int
{
$path = ltrim($path, '/');
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_realurl_pathdata');
$uid = $queryBuilder->select('tx_realurl_pathdata.page_id')
->from('tx_realurl_pathdata')
->join(
'tx_realurl_pathdata',
'pages',
'p',
$queryBuilder->expr()->eq('tx_realurl_pathdata.page_id',$queryBuilder->quoteIdentifier('p.uid'))
)
->where(
$queryBuilder->expr()->like('tx_realurl_pathdata.pagepath', $queryBuilder->createNamedParameter($path)),
$queryBuilder->expr()->eq('tx_realurl_pathdata.language_id', $queryBuilder->createNamedParameter($languageId, \PDO::PARAM_INT)),
$queryBuilder->expr()->eq('p.sys_language_uid', $queryBuilder->createNamedParameter($languageId, \PDO::PARAM_INT))
)
->orderBy('tx_realurl_pathdata.uid', 'DESC')
->execute()
->fetchColumn(0);
$this->logger->debug("findPageidForPathFromRealurl: path=$path language=$languageId returns $uid");
return (int)$uid;
}
對於以下內容,我假設您使用 Apache 網絡服務器,並且可以訪問 /etc/apache2 下的網絡服務器配置,例如。
我沒有任何數字,但我假設您在網絡服務器中處理的重定向比啟動 PHP 和 TYPO3 更有效。缺點是重定向也會針對 static 資產進行評估(除非在其他地方處理,例如 cdn)。 此外,這不能由編輯維護。 但是,如果您從 realurl 遷移,例如,您可以通過 Apache 使用此解決方案作為臨時解決方案,並在一段時間后將其取下。
但是,如果您有很多重定向,這可能會變得難以維護並且非常難看。
我見過的網站多年來經常積累重定向,經常愉快地混合使用 RewriteRule、Redirect(或重定向)、RedirectMatch 和 RewriteCond,以達到很好的效果。 為了保持整潔,我有 2 個建議(我維護的網站都使用過):
維護配置管理系統中的重定向(例如 angular、SiteStack)。 不要在那里寫重定向語句,而只需添加 URL 並讓您的狀態(或 CM 調用它們的任何內容)為您編寫它們
使用RewriteMap和一個由 URL 組成的文件。
對於這兩種解決方案,您通常有(至少)兩種類型的重定向:
兩者都可以用適當的 RewriteRule 語句處理,但它們看起來不同。 對於解決方案 1 和 2,您需要分別處理它們。
示例 1(正則表達式重定向):
RewriteRule /?abc/(.*)? /new$1 [R=307,L]
示例 2 RewriteMap:
/etc/apache2/sites-available/mysite.conf
RewriteEngine on
RewriteMap exactredirects "txt:/etc/apache2/redirects/exactredirects.txt"
RewriteRule "^(.*)$" "${exactredirects:$1|/404}" [R=307,L]
/etc/apache2/redirects/exactredirects.txt:
/abc.txt /def.txt
建議:
service apache2 reload
(錯誤中止)或apachectl configtest
。 (或者更好的是您的 CM 在執行狀態之前為您完成此操作)。RewriteRule
與Redirect
:您可以同時使用和/或它的變體做很多事情,例如 RedirectMatch 但 RewriteRule 通常更強大,另一個可能更快。 理想情況下使用其中之一。 另請參閱“何時不使用 mod_rewrite” 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.