Magento 1.9.1の更新情報
@Vinaiが指摘したバグは、機能がまだ壊れている他の理由のためにこのバージョンで解決されたようです(設定可能な製品の場合)
問題の本当の問題はおそらくここMage_Catalog_Model_Resource_Urlにありますが、時間がないので、コアのこのような繊細な部分には触れたくありません。
回避策の説明:
エントリポイントは常にこのクラスMage_Core_Model_Url_Rewrite_Request
、特にメソッドです_rewriteDb()
仕組み_rewriteDb():
- まず、現在のストアのリクエストをロードしようとします
(139): $this->_rewrite->loadByRequestPath($requestCases);
- その後、私はそれを見つけることができず(IDなし)、___from_storeパラメータを持っている場合
(142): if (!$this->_rewrite->getId() && $fromStore) {
- の書き換えをロードしてみてください___from_store:
(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
- 見つかった場合は、を使用id_pathして現在のストア用にロードします。
(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
すべて正常に見えますが、url_rewriteデータに問題があるため、インデックス機能に問題があります(少なくとも構成可能な製品の場合)。
- ストアを切り替えていて、新しいストアのURLが異なっていても、行139のリライトがロードされます。
問題は、この書き換えが間違っているid_pathことを指していることです(構成可能な製品IDを指すのではなく、単純な製品IDの1つを指している)
現在、回避策は!$this->_rewrite->getId()条件を削除することです。そのため、magentoは$fromstoreパラメーターがある場合は常にリダイレクトを見つけようとします
- 最良の方法は、catalog_urlインデックスを修正し、作成した誤った書き換えを削除することです。
ここで、高速な回避策のコード(モジュールを作成し、Mage_Core_Model_Url_Rewrite_Request自分でクラスを書き換える必要があります):
protected function _rewriteDb()
    {
        if (null === $this->_rewrite->getStoreId() || false === $this->_rewrite->getStoreId()) {
            $this->_rewrite->setStoreId($this->_app->getStore()->getId());
        }
        $requestCases = $this->_getRequestCases();
        $fromStore = $this->_request->getQuery('___from_store');
        if ($fromStore) {
            $stores = $this->_app->getStores(false, true);
            if (!empty($stores[$fromStore])) {
                /** @var $store Mage_Core_Model_Store */
                $store = $stores[$fromStore];
                $fromStoreId = $store->getId();
            } else {
                return parent::_rewriteDb();
            }
            $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
            if (!$this->_rewrite->getId()) {
                return parent::_rewriteDb();
            }
            // Load rewrite by id_path
            $currentStore = $this->_app->getStore();
            $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
            $this->_setStoreCodeCookie($currentStore->getCode());
            $targetUrl = $currentStore->getBaseUrl() . $this->_rewrite->getRequestPath();
            $this->_sendRedirectHeaders($targetUrl, true);
        }
        if (!$this->_rewrite->getId()) {
            return parent::_rewriteDb();
        }
        $this->_request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
            $this->_rewrite->getRequestPath());
        $this->_processRedirectOptions();
        return true;
    }