Magento core_url_rewriteテーブルが大きすぎる


105

私は、このテーブル自体が非常に乱雑になる可能性があるという大量のレポートに気付きました。私は〜5000 SKUと〜250カテゴリ(単一ストア)でサイトを運営しており、結果としてcore_url_rewrite600,000行を超え、500MB以上のテーブルがあります非常識です。

これにより、サイトのパフォーマンスが低下し、データベースが非常に大きくなる可能性があります。私はいくつかの掘り下げを行ったが、これに関するかなりの数の投稿を見つけました。

//これらのリンクは、新しいボードの実装以降に削除されました

これでテーブルの切り捨てとインデックスの再作成ができることがわかりましたが、これでは問題は解決せず、問題が再発するのを長引かせるだけです。

私が理解していることから、問題の一部は、製品の名前に基づいて同じURLキーを持つ製品であり、その結果、インデックス付きリンクになります。

記載されている修正は次のとおりです。

app/code/core/Mage/Catalog/Model/Url.php 〜807行目:

変化する:

 if ($product->getUrlKey() == '' && !empty($requestPath)
       && strpos($existingRequestPath, $requestPath) === 0
 ) 

に:

 if (!empty($requestPath)
       && strpos($existingRequestPath, $requestPath) === 0
 ) 

しかし、これでも問題を完全に解決するわけではありません。

私の質問は次のとおりです。

この問題が発生した場合、問題を繰り返し「管理」することなく、実際に問題を完全に解決する効果的で論理的かつ効率的なアルゴリズムを設定できましたか?

、本当にこのいくつかの洞察を感謝しています。

ところで:あなた自身に感謝し、あなたのテーブルが今どのように見えるか確認してください。あなたはそれを知らずにこの問題とその結果としてのパフォーマンスの影響を経験しているかもしれません-私は知りませんでした。

編集:www.Nexcess.net(Magentoプラチナホスティングパートナー)と連絡を取り合っており、core_url_rewriteかさばる結果としてテーブルの切り捨てが必要であるとクライアントから要求されていることを確認しました。

私の大きな心配は、これが持つ可能性のあるSEOの影響です。そのため、問題が再び発生するのを先延ばしにするのではなく、解決策が欲しいのです。

更新: Nexcessは、テーブル内の製品が重複しているため、SEOを実際に傷つけている可能性があると述べました。


うわー、それは驚くほど大きなテーブルです。私は自分で(200個の製品)をチェックしましたが、行数は最大で約800行ですが、製品名/ URLの複製に問題はありません。基準点として、表示可能な製品ごとに約6.6行があります。これはひどい現実的な比較ではありませんが、そのレートでは、5,000製品では30,000行程度しかありません。ソリューションの必要性を十分に理解できます。さらに大きなサイトを実装しようとしているので、この質問を見ていきます。
Pete855217 14年

@ Pete855217:この質問は、あなたがそれを支持していなかったとしても、あなたを面白そうに聞こえます。
モハンマドファイサル14年

1
EE1.12には、保存ごとに再書き込みが再作成されるバグがありました。1.7のバージョンにこの同じバグがある可能性があります。私が思い出すように、1.12のパッチは1.7でも機能していました
brentwpeterson 14年

1
非常に役立つ記事!130,000のアクティブな製品と25,000の無効な製品があり、core_url_rewrite_tableには2744023レコードがあります。この記事は良い出発点になりそうです。
MagentoMac 14

投稿を編集して、Magentoのカスタム書き換えを削除しない方法を含めました。
エスプラードリー

回答:


76

私は次のように問題を安定させることができました:

ステップ1:カタログURLモデルを書き換える(独自のモジュールを使用する:方法

注:書き換えを使用せずにコアファイルを上書きすると、Magentoのインスタンスが将来のアップグレードに対応できなくなります。

Jahnniのソリューションによる MagentoCommerceボード(新しいボードではアクティブではなくなりました)、app/code/core/Mage/Catalog/Model/Url.php[807行目付近Mage_Catalog_Model_Url::getProductRequestPath()]

から:

if ($product->getUrlKey() == '' && !empty($requestPath)
   && strpos($existingRequestPath, $requestPath) === 0
) 

に:

if (!empty($requestPath)
           && strpos($existingRequestPath, $requestPath) === 0
) 

ステップ2:切り捨て

core_url_rewriteテーブルを切り捨てる

ステップ3:キャッシュの再インデックスとフラッシュ

Core URL Rewritesでインデックスの再作成プロセスを開始します。その後、Magentoキャッシュとストレージキャッシュをフラッシュする必要があります。

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

出来上がり、すべての設定が完了しました。インデクサーを再実行すると、テーブルのサイズを一定に保つ必要があります(間に製品を追加した場合、またはカテゴリ名が重複している場合を除きます)。


5
すばらしい、core_url_rewriteテーブルは3.2 GBでしたが、現在は36.8 MBです:D by
muppet

同様の問題があります。Magento URL書き換えは、URLに乱数を追加します。Google Webマスターツールから添付されたスクリーンショットをご覧ください。ご覧のように、製品「Beige Embroidered Wedding Saree」には9つの異なるURLがありますが、それはたった1つの製品であり、878で終わる1つのURLのみを指します。実際のURLキーには最後に乱数がありません)。私のストアはかなり新しいもので、core_url_rewriteのサイズはそれほど大きくありません。したがって、ステップ1と2を実行するか、ステップ1のみを実行するかはわかりません。ステップ2を実行すると、カスタムの書き換えが失われます。
ゾヤ

1.9.1を実行していますが、スクリーンショットのURLがありません。monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNAr00XLdFTGTIOaydaW5yqS
ゾヤ

2
最初に既存のテーブルをエクスポートします。次に、手順1、2、および3に進みます。ここでcore_url_rewrite表を見て、レコードの数を書き留めます。手順3を再度実行し(インデックスの再作成)、core_url_rewriteテーブルのビューを更新します。番号が同じであれば、問題は解決しました。次に、カスタムの書き換えを手動でマージします。ではごきげんよう。
ムース

2
この修正は製品でのみ機能し、同一のURLキーを持つカテゴリでは機能しません。(パッチファイル付き)、より良いソリューションを@Simon s'の答えを参照してください
Giel Berkers

45

ここの誰かが答えを見つけてくれることを願っていますが、あなたが答えを見つけるかどうかわかりません。このテーブルは、さまざまな理由で大きくなります。Magentoの以前の(そしておそらく現在の)バージョンのバグは1つです。もう1つは、このテーブルにURLキー値への変更を追跡しようとするロジックがあり、古い製品の301/302書き換えがセットアップされるようにすることです。このため、事態を複雑にし、テーブルを切り詰めて再生成すると、既存のURLの書き換えがなくなる可能性があります。これは、検索エンジンのリストに未知の影響を及ぼします(必ずしも悪いことではなく、予測するのは困難です)。

尋ねるクライアントへの私の一般的なアドバイスは

  1. URL / SEOの状況をうまく把握できない場合は、巨大な成長テーブルをそのままにしておきます

  2. テーブルサイズが問題になるまで(たとえば、サイトマップの生成)。その場合は、URL / SEOの状況を把握してください。

  3. URL / SEOの状況を把握したら、テーブルをバックアップし、テーブルを切り捨てて再生成します。切り捨てによって引き起こされるURL / SEOの問題に対処します。

  4. ステップ3を自動化する

これをMagentoコードレベルで修正しようとするのは素晴らしいことですが、あなたは上流に泳いでいるでしょう。「MagentoがMagentoに過ぎない」ということを受け入れ、外部プロセスの問題を解決する方が良い場合もあります。


アドバイスのおかげで、状況については残念ですが、あなたが言及したように、外部プロセスによって処理される必要があると思います、すぐに。
ムース14年

2
特定の製品の標準は絶えず変化するため、この巨大なテーブルはすでにSEO問題を引き起こす可能性があります。モバイル用とデスクトップ用に別々のストアビューがある場合、URLが異なるためさらに悪化します。
メルビン

私に少しがっかりする答え
...-Fra

@Alan Storm、この回答を投稿した後、Mooseが投稿した回答についてどう思いますか?同じリスクがありますか?
グース

24

このURL書き換えインデクサーバグの修正を追加したいと思います。このバグは2013年3月のバガソンで開発され、その後さらに改善されました。この問題は解決するはずです。参考として、リンクのパッチファイルを以下に示します。

diff -rupN mage_org/app/code/core/Mage/Catalog/Model/Url.php src_shop/app/code/core/Mage/Catalog/Model/Url.php
--- mage_org/app/code/core/Mage/Catalog/Model/Url.php   2013-11-19 00:48:25.679009391 +0100
+++ src_shop/app/code/core/Mage/Catalog/Model/Url.php   2013-11-19 00:49:24.188005601 +0100
@@ -643,13 +643,24 @@ class Mage_Catalog_Model_Url
                 $this->_rewrite = $rewrite;
                 return $requestPath;
             }
+
+            // avoid unnecessary creation of new url_keys for duplicate url keys
+            $noSuffixPath = substr($requestPath, 0, -(strlen($suffix)));
+            $regEx = '#^('.preg_quote($noSuffixPath).')(-([0-9]+))?('.preg_quote($suffix).')#i';
+            $currentRewrite = $this->getResource()->getRewriteByIdPath($idPath, $storeId);
+            if ($currentRewrite && preg_match($regEx, $currentRewrite->getRequestPath(), $match)) {
+                $this->_rewrite = $currentRewrite;
+                return $currentRewrite->getRequestPath();
+            }
+
             // match request_url abcdef1234(-12)(.html) pattern
             $match = array();
             $regularExpression = '#^([0-9a-z/-]+?)(-([0-9]+))?('.preg_quote($suffix).')?$#i';
             if (!preg_match($regularExpression, $requestPath, $match)) {
                 return $this->getUnusedPath($storeId, '-', $idPath);
             }
-            $match[1] = $match[1] . '-';
+            $match[1] = $noSuffixPath . '-'; // always use full prefix of url_key
+            unset($match[3]); // don't start counting with a possible number in the url_key
             $match[4] = isset($match[4]) ? $match[4] : '';

             $lastRequestPath = $this->getResource()


さらに、GitHubでPATCH_SUPEE-389_EE_1.12.0.2_v2.sh利用できるようになったEEパッチを追加したいと思います

#!/bin/bash
# Patch apllying tool template
# v0.1.2
# (c) Copyright 2013. Magento Inc.
#
# DO NOT CHANGE ANY LINE IN THIS FILE.

# 1. Check required system tools
_check_installed_tools() {
    local missed=""

    until [ -z "$1" ]; do
        type -t $1 >/dev/null 2>/dev/null
        if (( $? != 0 )); then
            missed="$missed $1"
        fi
        shift
    done

    echo $missed
}

REQUIRED_UTILS='sed patch'
MISSED_REQUIRED_TOOLS=`_check_installed_tools $REQUIRED_UTILS`
if (( `echo $MISSED_REQUIRED_TOOLS | wc -w` > 0 ));
then
    echo -e "Error! Some required system tools, that are utilized in this sh script, are not installed:\nTool(s) \"$MISSED_REQUIRED_TOOLS\" is(are) missed, please install it(them)."
    exit 1
fi

# 2. Determine bin path for system tools
CAT_BIN=`which cat`
PATCH_BIN=`which patch`
SED_BIN=`which sed`
PWD_BIN=`which pwd`
BASENAME_BIN=`which basename`

BASE_NAME=`$BASENAME_BIN "$0"`

# 3. Help menu
if [ "$1" = "-?" -o "$1" = "-h" -o "$1" = "--help" ]
then
    $CAT_BIN << EOFH
Usage: sh $BASE_NAME [--help] [-R|--revert] [--list]
Apply embedded patch.

-R, --revert    Revert previously applied embedded patch
--list          Show list of applied patches
--help          Show this help message
EOFH
    exit 0
fi

# 4. Get "revert" flag and "list applied patches" flag
REVERT_FLAG=
SHOW_APPLIED_LIST=0
if [ "$1" = "-R" -o "$1" = "--revert" ]
then
    REVERT_FLAG=-R
fi
if [ "$1" = "--list" ]
then
    SHOW_APPLIED_LIST=1
fi

# 5. File pathes
CURRENT_DIR=`$PWD_BIN`/
APP_ETC_DIR=`echo "$CURRENT_DIR""app/etc/"`
APPLIED_PATCHES_LIST_FILE=`echo "$APP_ETC_DIR""applied.patches.list"`

# 6. Show applied patches list if requested
if [ "$SHOW_APPLIED_LIST" -eq 1 ] ; then
    echo -e "Applied/reverted patches list:"
    if [ -e "$APPLIED_PATCHES_LIST_FILE" ]
    then
        if [ ! -r "$APPLIED_PATCHES_LIST_FILE" ]
        then
            echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be readable so applied patches list can be shown."
            exit 1
        else
            $SED_BIN -n "/SUP-\|SUPEE-/p" $APPLIED_PATCHES_LIST_FILE
        fi
    else
        echo "<empty>"
    fi
    exit 0
fi

# 7. Check applied patches track file and its directory
_check_files() {
    if [ ! -e "$APP_ETC_DIR" ]
    then
        echo "ERROR: \"$APP_ETC_DIR\" must exist for proper tool work."
        exit 1
    fi

    if [ ! -w "$APP_ETC_DIR" ]
    then
        echo "ERROR: \"$APP_ETC_DIR\" must be writeable for proper tool work."
        exit 1
    fi

    if [ -e "$APPLIED_PATCHES_LIST_FILE" ]
    then
        if [ ! -w "$APPLIED_PATCHES_LIST_FILE" ]
        then
            echo "ERROR: \"$APPLIED_PATCHES_LIST_FILE\" must be writeable for proper tool work."
            exit 1
        fi
    fi
}

_check_files

# 8. Apply/revert patch
# Note: there is no need to check files permissions for files to be patched.
# "patch" tool will not modify any file if there is not enough permissions for all files to be modified.
# Get start points for additional information and patch data
SKIP_LINES=$((`$SED_BIN -n "/^__PATCHFILE_FOLLOWS__$/=" "$CURRENT_DIR""$BASE_NAME"` + 1))
ADDITIONAL_INFO_LINE=$(($SKIP_LINES - 3))p

_apply_revert_patch() {
    DRY_RUN_FLAG=
    if [ "$1" = "dry-run" ]
    then
        DRY_RUN_FLAG=" --dry-run"
        echo "Checking if patch can be applied/reverted successfully..."
    fi
    PATCH_APPLY_REVERT_RESULT=`$SED_BIN -e '1,/^__PATCHFILE_FOLLOWS__$/d' "$CURRENT_DIR""$BASE_NAME" | $PATCH_BIN $DRY_RUN_FLAG $REVERT_FLAG -p0`
    PATCH_APPLY_REVERT_STATUS=$?
    if [ $PATCH_APPLY_REVERT_STATUS -eq 1 ] ; then
        echo -e "ERROR: Patch can't be applied/reverted successfully.\n\n$PATCH_APPLY_REVERT_RESULT"
        exit 1
    fi
    if [ $PATCH_APPLY_REVERT_STATUS -eq 2 ] ; then
        echo -e "ERROR: Patch can't be applied/reverted successfully."
        exit 2
    fi
}

REVERTED_PATCH_MARK=
if [ -n "$REVERT_FLAG" ]
then
    REVERTED_PATCH_MARK=" | REVERTED"
fi

_apply_revert_patch dry-run
_apply_revert_patch

# 9. Track patch applying result
echo "Patch was applied/reverted successfully."
ADDITIONAL_INFO=`$SED_BIN -n ""$ADDITIONAL_INFO_LINE"" "$CURRENT_DIR""$BASE_NAME"`
APPLIED_REVERTED_ON_DATE=`date -u +"%F %T UTC"`
APPLIED_REVERTED_PATCH_INFO=`echo -n "$APPLIED_REVERTED_ON_DATE"" | ""$ADDITIONAL_INFO""$REVERTED_PATCH_MARK"`
echo -e "$APPLIED_REVERTED_PATCH_INFO\n$PATCH_APPLY_REVERT_RESULT\n\n" >> "$APPLIED_PATCHES_LIST_FILE"

exit 0


SUPEE-389 | EE_1.12.0.2 | v1 | 53c8ca52583358953b143aaa1a78cf409e8dd846 | Thu Jun 20 10:36:39 2013 +0300 | v1.12.0.2..HEAD

__PATCHFILE_FOLLOWS__
diff --git app/code/core/Mage/Catalog/Model/Url.php app/code/core/Mage/Catalog/Model/Url.php
index fa55fc5..a755b46 100644
--- app/code/core/Mage/Catalog/Model/Url.php
+++ app/code/core/Mage/Catalog/Model/Url.php
@@ -609,6 +609,23 @@ class Mage_Catalog_Model_Url
      */
     public function getUnusedPath($storeId, $requestPath, $idPath)
     {
+        $urlKey = '';
+        return $this->getUnusedPathByUrlkey($storeId, $requestPath, $idPath, $urlKey);
+    }
+
+    /**
+     * Get requestPath that was not used yet.
+     *
+     * Will try to get unique path by adding -1 -2 etc. between url_key and optional url_suffix
+     *
+     * @param int $storeId
+     * @param string $requestPath
+     * @param string $idPath
+     * @param string $urlKey
+     * @return string
+     */
+    public function getUnusedPathByUrlkey($storeId, $requestPath, $idPath, $urlKey = '')
+    {
         if (strpos($idPath, 'product') !== false) {
             $suffix = $this->getProductUrlSuffix($storeId);
         } else {
@@ -645,21 +662,22 @@ class Mage_Catalog_Model_Url
             }
             // match request_url abcdef1234(-12)(.html) pattern
             $match = array();
-            $regularExpression = '#^([0-9a-z/-]+?)(-([0-9]+))?('.preg_quote($suffix).')?$#i';
+            $regularExpression = '#(?P<prefix>(.*/)?' . preg_quote($urlKey) . ')(-(?P<increment>[0-9]+))?(?P<suffix>'
+                . preg_quote($suffix) . ')?$#i';
             if (!preg_match($regularExpression, $requestPath, $match)) {
-                return $this->getUnusedPath($storeId, '-', $idPath);
+                return $this->getUnusedPathByUrlkey($storeId, '-', $idPath, $urlKey);
             }
-            $match[1] = $match[1] . '-';
-            $match[4] = isset($match[4]) ? $match[4] : '';
+            $match['prefix'] = $match['prefix'] . '-';
+            $match['suffix'] = isset($match['suffix']) ? $match['suffix'] : '';

             $lastRequestPath = $this->getResource()
-                ->getLastUsedRewriteRequestIncrement($match[1], $match[4], $storeId);
+                ->getLastUsedRewriteRequestIncrement($match['prefix'], $match['suffix'], $storeId);
             if ($lastRequestPath) {
-                $match[3] = $lastRequestPath;
+                $match['increment'] = $lastRequestPath;
             }
-            return $match[1]
-                . (isset($match[3]) ? ($match[3]+1) : '1')
-                . $match[4];
+            return $match['prefix']
+                . (isset($match['increment']) ? ($match['increment']+1) : '1')
+                . $match['suffix'];
         }
         else {
             return $requestPath;
@@ -699,7 +717,7 @@ class Mage_Catalog_Model_Url
     {
         $storeId = $category->getStoreId();
         $idPath  = $this->generatePath('id', null, $category);
-        $suffix  = $this->getCategoryUrlSuffix($storeId);
+        $categoryUrlSuffix = $this->getCategoryUrlSuffix($storeId);

         if (isset($this->_rewrites[$idPath])) {
             $this->_rewrite = $this->_rewrites[$idPath];
@@ -713,27 +731,27 @@ class Mage_Catalog_Model_Url
             $urlKey = $this->getCategoryModel()->formatUrlKey($category->getUrlKey());
         }

-        $categoryUrlSuffix = $this->getCategoryUrlSuffix($category->getStoreId());
         if (null === $parentPath) {
             $parentPath = $this->getResource()->getCategoryParentPath($category);
         }
         elseif ($parentPath == '/') {
             $parentPath = '';
         }
-        $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath,
-                                                                           true, $category->getStoreId());
+        $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath, true, $storeId);

-        $requestPath = $parentPath . $urlKey . $categoryUrlSuffix;
-        if (isset($existingRequestPath) && $existingRequestPath == $requestPath . $suffix) {
+        $requestPath = $parentPath . $urlKey;
+        $regexp = '/^' . preg_quote($requestPath, '/') . '(\-[0-9]+)?' . preg_quote($categoryUrlSuffix, '/') . '$/i';
+        if (isset($existingRequestPath) && preg_match($regexp, $existingRequestPath)) {
             return $existingRequestPath;
         }

-        if ($this->_deleteOldTargetPath($requestPath, $idPath, $storeId)) {
+        $fullPath = $requestPath . $categoryUrlSuffix;
+        if ($this->_deleteOldTargetPath($fullPath, $idPath, $storeId)) {
             return $requestPath;
         }

-        return $this->getUnusedPath($category->getStoreId(), $requestPath,
-                                    $this->generatePath('id', null, $category)
+        return $this->getUnusedPathByUrlkey($storeId, $fullPath,
+            $this->generatePath('id', null, $category), $urlKey
         );
     }

@@ -798,7 +816,8 @@ class Mage_Catalog_Model_Url
             $this->_rewrite = $this->_rewrites[$idPath];
             $existingRequestPath = $this->_rewrites[$idPath]->getRequestPath();

-            if ($existingRequestPath == $requestPath . $suffix) {
+            $regexp = '/^' . preg_quote($requestPath, '/') . '(\-[0-9]+)?' . preg_quote($suffix, '/') . '$/i';
+            if (preg_match($regexp, $existingRequestPath)) {
                 return $existingRequestPath;
             }

@@ -836,7 +855,7 @@ class Mage_Catalog_Model_Url
         /**
          * Use unique path generator
          */
-        return $this->getUnusedPath($storeId, $requestPath.$suffix, $idPath);
+        return $this->getUnusedPathByUrlkey($storeId, $requestPath.$suffix, $idPath, $urlKey);
     }

     /**
@@ -891,8 +910,8 @@ class Mage_Catalog_Model_Url
                 $parentPath = Mage::helper('catalog/category')->getCategoryUrlPath($parentPath,
                     true, $category->getStoreId());

-                return $this->getUnusedPath($category->getStoreId(), $parentPath . $urlKey . $categoryUrlSuffix,
-                    $this->generatePath('id', null, $category)
+                return $this->getUnusedPathByUrlkey($category->getStoreId(), $parentPath . $urlKey . $categoryUrlSuffix,
+                    $this->generatePath('id', null, $category), $urlKey
                 );
             }

@@ -913,14 +932,14 @@ class Mage_Catalog_Model_Url
                 $this->_addCategoryUrlPath($category);
                 $categoryUrl = Mage::helper('catalog/category')->getCategoryUrlPath($category->getUrlPath(),
                     false, $category->getStoreId());
-                return $this->getUnusedPath($category->getStoreId(), $categoryUrl . '/' . $urlKey . $productUrlSuffix,
-                    $this->generatePath('id', $product, $category)
+                return $this->getUnusedPathByUrlkey($category->getStoreId(), $categoryUrl . '/' . $urlKey . $productUrlSuffix,
+                    $this->generatePath('id', $product, $category), $urlKey
                 );
             }

             // for product only
-            return $this->getUnusedPath($category->getStoreId(), $urlKey . $productUrlSuffix,
-                $this->generatePath('id', $product)
+            return $this->getUnusedPathByUrlkey($category->getStoreId(), $urlKey . $productUrlSuffix,
+                $this->generatePath('id', $product), $urlKey
             );
         }

このパッチをCEで使用する場合は、EE用に開発されているため、適切にテストしてください。


CEでこのEEパッチを自分でテストしましたか?
タイラーV.

@TylerV。いや...
サイモン・

3
EE 1.9.1.1でこのパッチを試しましたが、動作するように適合させることができます。同じURLキーを持つ製品とカテゴリの問題を修正します。彼らがこれを近い将来のリリースで実装することを期待しましょう。
ジェルバーカーズ

1
サイモンのおかげで、1つのクライアントのWebサイトで1GBから3MBになりました。6か月ごとに切り捨てなければならなかったので、今は小さくなっていることを願っています。)
willem wigman

1
私は1.9 CEでこれを試しましたが、製品では機能しますが、カテゴリは正しくありません。URL「... / test」を提供する「Test」というカテゴリがあり、「Test」という別のカテゴリを作成すると、URL「... / test-2」を提供する必要がありますが、代わりに番号だけではありません名前: '... /-2'
odd_duck

11

サイモンが投稿したパッチを適用した後、次のクエリを使用してジャンクデータを削除できます。

DELETE FROM core_url_rewrite
WHERE is_system <> 1 AND id_path REGEXP "^[0-9]+_[0-9]+$" AND
      (request_path REGEXP ".*-[0-9]*\.html" 
          OR target_path = request_path);

Ashish Hiraのクエリとは対照的に、これは最後の部分として整数を持っているURLにのみ影響します-これは-私の場合-混乱の理由です。

たとえば、URLキーの更新時に作成された可能性のある有効な書き換えに触れないようにします。


6

私は成功した受け入れられた答えを実装しました。別のMagentoインストールでは、いくつかのカスタム書き換えを保存する必要があったため、-で終わるすべてのエントリを削除し、次に最大5桁の数字を削除しました:

DELETE FROM `core_url_rewrite` WHERE `request_path` REGEXP '\\-[0-9]{1,5}$';

これはほとんど機能しましたが、インデックスを再作成するたびにさらに2行取得します。理由はわかりません。この経験を共有すると思いました。


1
おそらく有効なURLを削除しましたが、数字で終わっています。あなたはそれらを見つけるだろう$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToFilter('url_key', array('regexp' => '[0-9]$'));
メルビン

5

あなたが言及したコアの変更は、url_keysのない製品がある場合にのみ必要と思われますが、Magentoは常にurl_keysを作成する必要があります。url_keysを使用せずに製品を作成しているインポーターがある場合、これらの製品でこの問題が発生します。次のクエリを実行して、そのような製品を見つけてください。

SELECT cpe.entity_id, cpe.sku, cpev.value
FROM catalog_product_entity cpe
LEFT JOIN catalog_product_entity_varchar cpev
ON cpe.entity_id = cpev.entity_id AND cpev.attribute_id = (
    SELECT attribute_id
    FROM eav_attribute
    WHERE `entity_type_id` = 4
    AND `attribute_code` = 'url_key'
)
WHERE cpev.value IS NULL OR cpev.value = ''

そのクエリから製品が返される場合、url_keyがないため、問題が発生します。


2
デフォルトことを覚えentity_type_id製品については4ではなく10です
サイモン

3

URLの重複した書き換えを防ぐために、承認済みのソリューションに従ってcore_url_rewrite、CSVファイルとしてエクスポートしました。このCSVを開き、手動で作成されたURL書き換え以外のすべてを削除できました。

次にcore_url_rewrite、テーブルを切り捨て、保存したCSVを手動で作成したURL書き換えでインポートしました。

すべての変更後、940K行から32Kになりました。大幅な改善。


3

https://github.com/biotech/Magento-URL-Rewriteを修正するためのMagentoコミュニティのパッチ(ローカル書き換え)は、実際にはEEパッチPATCH_SUPEE-389_EE_1.12.0.2_v2.shと同じです -すべての書き換えを確認し、重複レコードの作成を避けます。製品の一括インポートの変更後、生産CE 1.9、15,000個の製品、4つの店舗、毎晩の完全なインデックス再作成で、過去2か月間良好に機能します。


これはどれほど徹底的にテストされていますか?それがわずか1時間前に投稿されたようですが....に見える
SR_Magento

これは1.9.2.xで修正されたため、テーブルの膨張を心配する必要はなくなりましたか?
フィアスコLabsの

問題を解決できる場合でも、単一リンクの回答は最良の回答ではありません。コードの機能について少し説明してください。
マリウス

@FiascoLabsはい、すべてのCE 1.9.xで正常に動作します
FireBear

1
@FiascoLabs:1.9.2.xにはまだこの「リライトブロート」問題があり、この修正は含まれていませんが、FireBearが言ったように、EEパッチはCE 1.9.2.xで動作します。(個人的に試したことはありません。1.9.2.2にはまだこの問題があることを明確にしたかっただけです)
エリックイーストランド

2

このスレッドではまだ言及されていないため、Magento 1.9.3.9以降でこの問題が修正されたというクールなニュースを共有したいと思いました。関連するリリースノートを参照してください。

Magentoはcore_url_rewriteテーブルで不要な書き込み操作を実行しなくなりました。

したがって、1.9.3.9以上のバージョンのMagentoを使用する場合、ここで説明したこの問題のすべての修正は必要ありません。Alex answerで説明されているように、古い値を削除することをお勧めします


1

このクエリを実行する

DELETE FROM core_url_rewrite WHERE is_system <> 1 AND id_path REGEXP "^[0-9]+_[0-9]+$";

これにより、core_url_size迷惑データを削除してテーブルのサイズを小さくすることができます。


これはジャンクデータですか?URLキーを変更したときに作成された書き換えも削除したと思います!
アレックス

正規表現を確認してください。有効なIDを持たないこの意味
Asish Hira

ただし、これらのIDは、バックエンドでURLキーを手動で変更するときにも作成されます。私の答えもご覧ください。
アレックス

0

取り除く .html

  1. サフィックスを使用しないでください .html
  2. .htaccessで設定

    ## Redirect all htmls.
    RewriteRule (.+)\.html$ /$1 [L,R=301]
  3. すべての.htmlリダイレクトを消去します。

    DELETE FROM core_url_rewrite WHERE request_path LIKE '%.html'

0

公式の答えはSUPEE-389をインストールすることです。そのような単純な。

Magento CEとまったく同じコードを共有しているため、Magento CEと完全に連携します。

パッチファイルはhttps://gist.github.com/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-shにあります。

この問題が発生し、各カタログURLの再インデックス後に数千の新しい行が生成されました。これで問題はなくなりました... DBをきれいにしなければならないという事実を除いて。

ここで提供されるスクリプトは良いスタートのように思えますが、完璧なソリューションではありません。

php shell / rewrites_doctor.php --remove_rewrites 4

https://www.atwix.com/magento/duplicated-product-url-keys-in-community-edition/ご覧ください


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.