제품 상점보기 범위 URL 키가있는 상점 스위치의 404


13

URL Key제품 페이지에서 기본적 으로 전역 범위입니다.

편집 : FlorinelChis가 제안한 것처럼 범위는 속성 관리에서 변경 될 수 있습니다. 그러나 이로 인해 상점보기 스위처 동작이 중단됩니다.

이는 샘플 데이터와 "URL에 상점 코드 추가"를 사용 하여 1.7.0.2에서 테스트되었습니다 .

  1. 제품을 수정하고 특정 상점보기 (프랑스어)에 대해 다른 URL을 설정하십시오.
  2. 재색 인
  3. 영어 상점보기 사이트의 제품 페이지 열기
  4. 프랑스어로 전환 : 페이지 URL 포함 /French/
  5. 영어로 다시 전환-> 404 페이지 오류 (URL에 상점 코드가 누락 됨) /default/

    상점보기 / 언어 스위치로 올바르게 작동시키는 방법은 무엇입니까?

세부:

  • 영어 URL : /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • 프랑스어 URL : /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

이 페이지에 영어 사이트가 있다면-> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

그런 다음 프랑스어로 전환합니다.

이 URL을 얻었습니다 ( 상점 코드가 누락되었습니다 ).
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

따라서 magento는 URL을 올바르게 다시 작성하지만 어떤 이유로 상점 코드를 놓치십시오.

참고:

확실히이 관련되어 /core/model/store.php하고 /core/model/url/rewrite.php, 특히 그 방법에 :

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

최신 정보

1.9.1에 @Vinai 수정 프로그램이 작동하지 않으면 추가 한 새 답변을 확인하십시오.


어떤 마 젠토 버전을 사용하고 있습니까?
FlorinelChis

마 젠토 1.7.0.2
Fra

Tim 나는 현재 몇 가지 답변을 테스트 중이며 작동하는지 확인한 후에 수락합니다.
Fra

답변:


12

문제는 모델 Mage_Core_Model_Url_Rewrite_Request(Magento 1.8) 및 Mage_Core_Model_Url_Rewrite이전 버전 의 버그입니다 .

1.8의 핵심 코드 섹션은 다음과 같습니다.

    // Section from Mage_Core_Model_Url_Rewrite_Request::_rewriteDb()

    $fromStore = $this->_request->getQuery('___from_store');
    if (!$this->_rewrite->getId() && $fromStore) {
        $stores = $this->_app->getStores();
        if (!empty($stores[$fromStore])) {
            $store = $stores[$fromStore];
            $fromStoreId = $store->getId();
        } else {
            return false;
        }

버그 : query 매개 변수의 값은 상점 코드입니다 (제 경우 de에는 en또는 fr). 로 반환 된 배열의 키 app->getStores()숫자 저장소 ID입니다. 그래서 if (!empty($stores[$fromStore])) {항상 실패합니다.

해당 버그가 수정되면 나중에 같은 방법으로 다른 버그가 명백해집니다 (1.8에서만 생각합니다).

$targetUrl = $this->_request->getBaseUrl() . '/' . $this->_rewrite->getRequestPath();

요청 오브젝트 기본 URL은 항상 상점 코드가 없는 Magento base_url 입니다. $currentStore->getBaseUrl()대신 사용하면 그 버그도 수정됩니다.

이 두 가지 문제가 해결되면 언어 전환기가 제대로 작동합니다. 다음은 Magento 1.8 (CE)의 확장 기능입니다. https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

Magento 1.7에서는 문제가 다를 수 있습니다. 나는 구글이 1.8 이상 또는 그 이상을 실행하는 누군가를 여기로 데려 오는 경우를 대비 하여이 답변을 추가 할 것이라고 생각했다.


내가 구현 한 수정이 안전하다고 생각하십니까?
Fra

솔직히 말해서 1.7의 문제의 원인을 조사하지 않았습니다. 동작의 원인을 정확히 이해하지 않고 수정 프로그램을 구현하는 것은 항상 위험합니다.
Vinai

2 년 후이 토론을 다시 열지 못했지만이 버그에 다시 왔습니다 ... 1.9.1에서 문제는 if condition $ this-> _ rewrite-> getId () ... 기본적으로 두 번째 저장소보기 magento manage 재 작성을로드하고, 그래서 그것은 리디렉션을 트리거하지 않습니다 ...하지만이 재 작성 (제품 ID가 1 인)가 404로드 있도록 잘못된 id_path있다
훌라

4

실제로 Magento 1.8을 실행중인 경우 Magento 1.7.0.2에서이 문제에 대한 해결 방법을 찾았습니다. Vinai의 자세한 설명을보십시오.

문제의 일부가 요청 컨트롤러와 관련된 것으로 보입니다 Mage_Core_Controller_Request_Http.

161 행을 보면 다음과 같은 조건이 있습니다.

                elseif ($storeCode !== '') {
                    $this->setActionName('noRoute');
                }

그것을 주석 처리하면 카테고리 / 제품 페이지에서 다른 상점으로 전환 할 때 404 오류가 수정됩니다.

그러나 알 수없는 이유로 언젠가 응답 Url에서 상점 코드가 누락되었지만 두 URL이 모두 작동하므로 더 이상 문제가 발생하지 않습니다.

  • MAGEDOMAIN / sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
  • MAGEDOMAIN / sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

이 상태에 대한 의견이 다른 문제를 일으킬 수 있는지는 아직 명확하지 않습니다.


제품을 볼 때 다른 언어로 전환 할 때마다 404가 표시됩니다.이를 수정하고 말한 것처럼 이상한 URL에서 상점 코드를 생략합니다. 이와 같은 핵심 컨트롤러를 편집하는 것이 좋지 않기 때문에 이것이 최선의 해결책이라고 생각할 수 없습니다. 다른 솔루션을 찾은 적이 있는지 궁금합니다.
waffl

코어 파일을 편집 할 필요가 없으며, 고유 한 모듈을 작성하고 해당 클래스 / 방법을 다시 작성할 수 있습니다.
Fra

1
Mage_Core_Controller_Request_Http모듈에서 다시 쓸 수 없습니다.
benmarks

4

마 젠토 1.9.1에 대한 일부 업데이트 된 정보

@Vinai 지적 버그는 어쨌든이 기능이 여전히 깨진 다른 이유로이 버전에서 해결 된 것으로 보입니다 (구성 가능한 제품의 경우)

문제 실제 문제는 아마도 여기에 Mage_Catalog_Model_Resource_Url있지만 시간이 없으며 핵심의 섬세한 부분을 만지고 싶지 않습니다.

해결 방법에 대한 설명 :

진입 점은 항상이 클래스 Mage_Core_Model_Url_Rewrite_Request 이며 특히 메소드입니다._rewriteDb()

어떻게 _rewriteDb()작동 :

  1. 먼저 현재 상점에 대한 요청을로드하려고합니다.

(139) : $this->_rewrite->loadByRequestPath($requestCases);

  1. 그런 다음 찾을 수 없으며 (id 없음) ___from_store매개 변수가 있습니다

(142) : if (!$this->_rewrite->getId() && $fromStore) {

  1. 에 대한 다시 쓰기를로드하십시오 ___from_store.

(152) : $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);

  1. 찾은 경우를 사용 id_path하여 현재 상점에 대한 것을로드합니다.

(159) : $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

url_rewrite 데이터에 문제가 있으며 색인 기능 (적어도 구성 가능한 제품의 경우)에는 문제가 있습니다.

  • 우리가 상점을 바꾸고 있고 새로운 상점이 다른 URL을 가지고 있더라도 139 행에 다시 쓰기가로드됩니다.

문제는이 다시 쓰기가 잘못된 id_path것을 가리키는 것입니다 (구성 가능한 제품 ID를 가리키는 대신 간단한 제품 ID 중 하나를 가리킴)

이제 해결 방법은 !$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;
    }

3

URL 키 는 속성입니다. 카탈로그-> 속성-> 속성 관리 에서 편집 할 수 있습니다 . url_key를 검색 하고 클릭하십시오. url_key 속성 편집

범위를 변경 하고 저장하십시오.

이제 각 상점보기에서 제품에 대해 다른 URL 키를 가질 수 있습니다.


질문을 업데이트
Fra

상점을 전환 할 때 상품 페이지가 아닌 해당 상점 홈페이지에 방문해야합니다.
FlorinelChis

당신이 시작하는 곳은 당신이 시작하는 곳과 같습니다. 당신이 카테고리 페이지에 있다면 당신은 다른 언어로 같은 페이지에 도착해야합니다
Fra

1

각 상점보기의 URL을 변경 하시겠습니까?

현재 프랑스 매장의 점수 범위에서 영어 URL과 다른 제품 URL을 수정 했습니까? 둘 사이를 전환하면 404가됩니다. 이것은 예상 된 동작입니다.

Magento won't store different URL rewrites for other store views. So when you hit /french/product1 on the French store, the URL will match in the table and it will load. But when you hit it in the English store, there will be no match and thus will 404.

What it sounds like you need is to just "Add store codes to URL" - which will leave your URL keys alone, but prefix all respective URLs with your store code. This should then allow your store switcher to function.


1
as confirmed by Vinai this is a bug
Fra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.