마 젠토 core_url_rewrite 테이블이 너무 큼


105

이 테이블 자체가 매우 어수선해질 수 있다는 많은 보고서를 발견했습니다. 나는 ~ 5000 SKU와 ~ 250 카테고리 (단일 상점)와 core_url_rewrite60 만 라인 이상 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
 ) 

그러나 이것으로도 문제가 완전히 해결되지는 않습니다.

내 질문은 다음과 같습니다.

이 문제가 발생한 경우 문제를 반복적으로 "관리"하지 않고 실제로 문제를 한 번에 해결 하는 효과적이고 논리적 인 효율적인 알고리즘 을 설정 했습니까?

이것에 대한 통찰력을 정말로 고맙게 생각할 입니다.

BTW : 부탁을 드려서 지금 테이블이 어떻게 보이는지 확인하십시오.이 문제와 그 결과로 모르는 사이에 성능 영향이 발생할 수 있습니다.

편집 : 나는 www.Nexcess.net (Magento 플래티넘 호스팅 파트너)과 연락을 했으며 고객 core_url_rewrite이 너무 부피가 커서 테이블 을 자르도록 요청했음을 확인했습니다 .

내 큰 걱정은 이것이 발생할 수있는 SEO 영향이므로 문제가 다시 발생하지 않도록 지연시키는 대신 솔루션을 원합니다.

업데이트 : Nexcess는 테이블에 중복 제품이 있으면 실제로 SEO를 손상시킬 수 있다고 언급했습니다.


와우, 그것은 엄청나게 큰 테이블입니다. 내 제품 (200 개 제품)을 확인했는데 ~ 800 행만 있지만 제품 이름 / URL을 복제하는 데 문제가 없습니다. 기준점으로, 보이는 제품 당 약 6.6 행이 있습니다. 나는 이것이 끔찍한 현실 비교는 아니지만, 그 속도로 5,000 제품으로 ~ 30,000 행 정도를 가질 것이라고 인정합니다. 솔루션에 대한 귀하의 요구를 잘 이해할 수 있으며 훨씬 더 큰 사이트를 구현하려고 할 때이 질문을 볼 것입니다.
Pete855217

@ Petete217217 :이 질문은 당신이 그것을 upvoted하지 않았더라도 당신에게 흥미로운 소리를냅니다.
Mohammad Faisal

1
EE1.12에는 각 저장시 다시 쓰기가 다시 작성되는 버그가있었습니다. 1.7 버전의 동일한 버그가있을 수 있습니다. 1.12 패치도 1.7에서 작업했습니다
brentwpeterson

1
매우 유용한 기사! 우리는 130,000 개의 활성 제품과 25,000 개의 비활성 제품을 보유하고 있습니다. core_url_rewrite_table에는 2744023 개의 레코드가 있습니다. 이 기사는 좋은 출발점으로 보인다.
MagentoMac

Magento에서 사용자 지정 다시 쓰기를 삭제하지 않는 방법을 포함하도록 게시물을 편집했습니다.
espradley 2016 년

답변:


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 단계 : 캐시 재색 인 및 플러시

핵심 URL 다시 쓰기에서 재색 인화 프로세스를 시작하십시오. 그런 다음 Magento 캐시 및 스토리지 캐시를 비 웁니다.

SystemCache ManagementFlush Magento Cache

SystemCache ManagementFlush Cache Storage

짜잔, 모두 준비되었습니다. 인덱서를 다시 실행하면 테이블의 크기가 일정하게 유지됩니다 (제품 사이에 더 많은 제품을 추가하지 않았거나 카테고리 이름이 중복되지 않은 경우).


5
좋아요, 내 core_url_rewrite 테이블은 3.2 GB입니다 지금은 36.8 MB입니다 :
muppet

비슷한 문제가 있습니다. Magento URL은 URL에서 임의의 숫자를 다시 작성합니다. Google 웹 마스터 도구에서 첨부 된 스크린 샷을 참조하십시오. 보시다시피 "Beige Embroidered Wedding Saree"는 9 개의 서로 다른 URL을 가지고 있지만 하나의 제품 일 뿐이며 878로 끝나는 하나의 URL만을 가리 킵니다. 실제 URL 키는 끝에 임의의 숫자가 없습니다 (스크린 샷 첨부) ). 내 상점은 상당히 새롭고 core_url_rewrite의 크기는 그리 크지 않습니다. 따라서 1 단계와 2 단계 또는 1 단계 만 수행해야하는지 확실하지 않습니다. 2 단계를 수행하면 사용자 지정 다시 쓰기가 손실됩니다.
Zoya

1.9.1을 실행 중이며 여기에 스크린 샷 URL이 누락되었습니다. monosnap.com/image/duL0f64WWlACtlt9kcn04BWqY3L5Xl monosnap.com/image/osFk8kYNAr00XLdFTGTIOaydaW5yqS
Zoya

2
기존 테이블을 먼저 내 보냅니다. 그런 다음 1, 2, 3 단계를 진행 core_url_rewrite합니다. 지금 테이블을 보고 레코드 수를 기록해 두십시오. 3 단계 (다시 색인 생성)를 다시 실행하고 core_url_rewrite테이블에서 보기를 새로 고치십시오 . 숫자가 동일하면 성공적으로 해결 된 것입니다. 그런 다음 사용자 지정 다시 쓰기를 수동으로 병합하십시오. 모두 제일 좋다.
무스

2
이 수정은 동일한 URL 키를 가진 카테고리가 아닌 제품에만 적용됩니다. 더 나은 솔루션 (패치 파일 포함)은
@Simon

45

나는 여기에 누군가가 대답하기를 희망하지만, 나는 당신이 하나를 찾을 것이라는 것을 모른다. 이 테이블은 여러 가지 이유로 부피가 커집니다. Magento의 이전 버전과 현재 버전의 버그는 하나입니다. 이 표에는 URL 키 값의 변경 사항을 추적하여 이전 제품에 301/302 다시 쓰기가 설정되도록하는 논리가 있습니다. 이로 인해 문제가 복잡해지고 테이블을 자르고 재생성하면 기존 URL 다시 쓰기가 사라질 수 있으며 이는 검색 엔진 목록에 알 수없는 영향을 미칩니다 (필요한 것은 아니지만 예측하기 어렵습니다).

물어 보는 고객에 대한 나의 일반적인 조언은

  1. URL / SEO 상황을 잘 처리하지 못하면 거대한 성장 테이블을 그대로 두십시오.

  2. 테이블 크기가 문제가되기 시작할 때까지 (예 : 사이트 맵 생성). 이런 일이 발생하면 URL / SEO 상황을 처리하십시오.

  3. URL / SEO 상황에 대한 핸들이 있으면 테이블을 백업 한 다음 테이블을 자르고 재생성하십시오. 잘림으로 인한 모든 URL / SEO 문제를 해결하십시오.

  4. 3 단계 자동화

마 젠토 코드 레벨에서이 문제를 해결하는 것은 훌륭하지만, 당신은 상류에서 수영 할 것입니다. 때때로 "그냥 마 젠토가 마젠 토인 것"을 받아들이고 외부 프로세스의 문제를 해결하는 것이 좋습니다.


조언에 감사드립니다, 그것은 상황에 대한 유감이지만, 당신이 언급 한 것처럼 외부 프로세스에 의해 처리되어야한다고 생각합니다.
Moose

2
이 거대한 테이블은 주어진 제품에 대한 표준이 지속적으로 변경되므로 이미 SEO 문제를 일으킬 수 있습니다. 모바일 및 데스크톱에 대해 별도의 상점보기가있는 경우 URL이 다르기 때문에 더욱 악화됩니다.
Melvyn

나에게 조금 실망스러운 답변 ...
Fra

@Alan Storm,이 답변을 게시 한 후 Moose가 게시 한 답변에 대해 어떻게 생각하십니까? 같은 위험이 보입니까?
Goose

24

2013 년 3 월 bugathon에서 개발되었으며 이후에 더 개선 된 이 URL 재 작성 인덱서 버그에 대한 수정 사항 을 추가하고 싶습니다 . 이 문제를 해결해야합니다. 참고로 다음은 링크의 패치 파일입니다.

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 패치를 직접 테스트 했습니까?
Tyler V.

@TylerV. 아니요.
Simon

3
EE 1.9.1.1에서이 패치를 사용해 보았습니다. URL 키가 동일한 제품 및 카테고리의 문제를 해결합니다. 그들이 곧 릴리스에서 이것을 구현하기를 바랍니다.
Giel Berkers 2016 년

1
감사합니다 사이먼, 그냥 지금 :) 작은 남아 희망 ... 하나 개의 클라이언트의 웹 사이트에 3메가바이트에 1기가바이트에서 가서 6 개월 전에 잘라야했다
윌렘 wigman

1
방금 1.9 CE 에서이 제품을 사용해 보았지만 제품에는 효과가 있지만 범주가 올바르지 않습니다. URL에 '... / test'를 제공하는 'Test'라는 카테고리가 있고 'Test'라는 다른 카테고리를 작성하면 URL에 '... / test-2'를 제공해야하지만 대신 숫자는 제공하지 않습니다. 이름 : '... / - 2'
odd_duck

11

Simon이 게시 한 패치를 적용한 후 다음 쿼리를 사용하여 정크 데이터를 제거 할 수 있습니다.

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]$'));
Melvyn

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제품 의 기본값 은 10이 아니라 4입니다.
Simon

3

중복 URL 다시 쓰기를 방지하기 위해 승인 된 솔루션을 따른 다음 core_url_rewriteCSV 파일 로 내보냈습니다 . 이 CSV를 열고 수동으로 생성 한 URL 재 작성을 제외한 모든 URL을 삭제할 수있었습니다.

그런 다음 core_url_rewrite테이블을 자르고 수동으로 만든 URL 다시 쓰기로 저장된 CSV를 가져 왔습니다.

모든 변경 후 940K 행에서 32K로 이동했습니다. 큰 개선.


3

다음은 https://github.com/biotech/Magento-URL-Rewrite 와 같은 Magento Community의 패치 (로컬 다시 쓰기)입니다 . 실제로 EE 패치 PATCH_SUPEE-389_EE_1.12.0.2_v2.sh 와 동일 합니다. 다시 쓰기 및 확인 중복 된 레코드 생성을 피하십시오. 벌크 제품 수입 변경 후 매일 밤 생산 CE 1.9, 15k 제품, 4 상점, 전체 재 색인에 대해 지난 2 개월간 잘 작동합니다.


이 테스트는 얼마나 철저합니까? 한 시간 전에 게시 된 것 같습니다 ...
SR_Magento

이것은 1.9.2.x에서 수정되었으므로 더 이상 테이블 팽창에 대해 걱정할 필요가 없습니까?
Fiasco Labs

문제를 해결할 수 있어도 단일 링크 답변이 최선의 답변이 아닙니다. 코드가하는 일을 조금 설명해주세요.
Marius

@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 키를 변경할 때 생성 된 내용도 삭제되었다고 생각합니다!
Alex

정규식을 확인하십시오. 유효한 ID가없는 평균
Asish Hira

그러나 백엔드에서 URL 키를 수동으로 변경할 때 해당 ID도 작성됩니다. 내 답변도 참조하십시오.
Alex

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는이 영역에서 동일한 코드를 공유하므로 완벽하게 작동합니다.

패치 파일은 https://gist.github.com/piotrekkaminski/c348538ca91ba35773be#file-patch_supee-389_ee_1-12-0-2_v2-sh 에서 찾을 수 있습니다.

이 문제가 발생하여 각 카탈로그 URL 재색 인 후에 수천 개의 새 행이 생성되었습니다. 이제 DB를 청소해야한다는 사실을 제외하고는 문제가 해결되었습니다.

여기에 제공된 스크립트는 좋은 시작처럼 보이지만 완벽한 솔루션은 아닙니다.

PHP 쉘 /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.