404 trên Cửa hàng Chuyển đổi với Cửa hàng Sản phẩm Xem Khóa URL có phạm vi


13

Theo mặc định URL Keytrên trang sản phẩm là phạm vi toàn cầu.

EDIT: Theo đề xuất của FlorinelChis, phạm vi có thể thay đổi trong Quản lý thuộc tính. Tuy nhiên, điều này phá vỡ hành vi chuyển đổi xem cửa hàng.

Điều này đã được thử nghiệm vào ngày 1.7.0.2 với dữ liệu mẫu và bật "Thêm mã cửa hàng vào URL" :

  1. chỉnh sửa một sản phẩm và đặt một url khác nhau cho một kho lưu trữ cụ thể (tiếng Pháp)
  2. Lập chỉ mục lại
  3. Mở trang sản phẩm trên trang web trên cửa hàng tiếng Anh
  4. Chuyển sang tiếng Pháp: bạn sẽ có URL trang chống lại /French/
  5. Chuyển về tiếng Anh -> lỗi trang 404 (url bỏ lỡ mã cửa hàng /default/

    Làm thế nào để làm cho nó hoạt động chính xác với cửa hàng xem / chuyển đổi ngôn ngữ?

Chi tiết:

  • URL cho tiếng Anh: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • URL cho tiếng Pháp: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Nếu tôi trên trang web tiếng Anh trên trang này -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Sau đó tôi chuyển sang tiếng Pháp:

Tôi đã nhận được URL này ( mã cửa hàng bị bỏ qua ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Vì vậy, magento viết lại url một cách chính xác nhưng bỏ lỡ mã cửa hàng vì một số lý do

Tài liệu tham khảo:

Để chắc chắn điều này có liên quan đến /core/model/store.php/core/model/url/rewrite.php, và đặc biệt với các phương thức đó:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

CẬP NHẬT

Nếu bạn đang sử dụng bản sửa lỗi 1.9.1 @Vinai sẽ không hoạt động, hãy kiểm tra câu trả lời mới tôi đã thêm


bạn đang sử dụng phiên bản Magento nào?
FlorinelChis

Magento 1.7.0.2
Fra

Tim tôi hiện đang thử nghiệm một số câu trả lời và sẽ chấp nhận chúng sau khi xác nhận rằng chúng đang hoạt động.
Fra

Câu trả lời:


12

Vấn đề là một lỗi trong mô hình Mage_Core_Model_Url_Rewrite_Request(Magento 1.8) vàMage_Core_Model_Url_Rewrite (các phiên bản trước đó).

Phần mã lõi trong 1.8 trông như thế này:

    // 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;
        }

Bug: giá trị của tham số truy vấn là mã cửa hàng, (trong trường hợp của tôi de, enhoặc fr). Các khóa của mảng được trả về app->getStores()là ID cửa hàng số . Đó là lý do tại sao if (!empty($stores[$fromStore])) {luôn luôn thất bại.

Khi lỗi đó được sửa, một lỗi khác sẽ xuất hiện sau đó trong cùng một phương thức (tôi nghĩ chỉ trong 1.8):

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

Url cơ sở của đối tượng yêu cầu luôn là Magento base_url, không có mã cửa hàng. Sử dụng $currentStore->getBaseUrl()thay vì có sửa lỗi đó, quá.

Khi hai vấn đề đó được khắc phục, trình chuyển đổi ngôn ngữ hoạt động tốt. Đây là một tiện ích mở rộng chính xác cho Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

Trong Magento 1.7, vấn đề có thể khác. Tôi vẫn nghĩ tôi sẽ thêm câu trả lời này, chỉ trong trường hợp google đưa người khác đến đây đang chạy 1.8 hoặc mới hơn.


Bạn có nghĩ rằng bản sửa lỗi tôi đã thực hiện là an toàn?
Fra

Thành thật mà nói, tôi đã không xem xét nguyên nhân của vấn đề trong 1.7. Thực hiện một sửa chữa mà không hiểu chính xác những gì gây ra hành vi luôn có rủi ro.
Vinai

Xin lỗi, đã mở lại cuộc thảo luận này sau 2 năm nhưng tôi lại gặp lỗi này ... vào ngày 1.9.1, vấn đề là với điều kiện if $ this -> _ viết lại-> getId () ... về cơ bản đối với cửa hàng thứ hai quản lý magento để tải viết lại và do đó Nó không kích hoạt chuyển hướng ... tuy nhiên việc viết lại này có id_path sai (id sản phẩm là +1) vì vậy nó tải 404
Fra

4

Trên thực tế tôi đã tìm thấy một cách giải quyết cho vấn đề này trên Magento 1.7.0.2 nếu bạn đang chạy Magento 1.8 xem lời giải thích chi tiết của Vinai:

Có vẻ như một phần của vấn đề có liên quan đến bộ điều khiển yêu cầu Mage_Core_Controller_Request_Http.

Nếu bạn nhìn vào dòng 161 thì có điều kiện này:

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

Nhận xét nó khắc phục lỗi 404 khi tôi chuyển sang Cửa hàng khác trong trang danh mục / sản phẩm.

Tuy nhiên vì một số lý do không xác định, đôi khi mã cửa hàng bị bỏ lỡ trong Url phản hồi nhưng điều này không gây ra sự cố nữa vì cả hai url đều hoạt động:

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

Tôi không rõ ràng nếu bình luận về tình trạng này có thể gây ra vấn đề khác


Tôi cũng có thể xác nhận điều này cũng hiệu quả với tôi - bất cứ khi nào chuyển sang ngôn ngữ khác khi xem sản phẩm, tôi sẽ nhận được 404. Điều này đã sửa nó và như bạn đã nói, bỏ qua mã cửa hàng từ URL lạ. Tôi không thể tưởng tượng đây là giải pháp tốt nhất vì chỉnh sửa bộ điều khiển lõi như thế này không tốt, tôi tự hỏi liệu cuối cùng bạn có tìm được giải pháp khác không?
waffl

bạn không cần chỉnh sửa bất kỳ tệp cốt lõi nào, bạn có thể tạo mô-đun của riêng mình và viết lại lớp / phương thức đó.
Fra

1
Mage_Core_Controller_Request_Httpkhông thể được viết lại trong một mô-đun.
benmark

4

Một số thông tin cập nhật cho Magento 1.9.1

Lỗi @Vinai chỉ ra có vẻ như đã được giải quyết trong phiên bản này vì lý do khác là chức năng vẫn bị hỏng (đối với các sản phẩm có thể định cấu hình)

Vấn đề thực sự có lẽ là ở đây Mage_Catalog_Model_Resource_Urltuy nhiên tôi không có thời gian và tôi không muốn chạm vào một phần cốt lõi như vậy.

Giải thích cho cách giải quyết:

Điểm vào luôn là lớp này Mage_Core_Model_Url_Rewrite_Request và đặc biệt là phương thức_rewriteDb()

Cách _rewriteDb()làm việc

  1. Đầu tiên, nó cố gắng tải yêu cầu cho cửa hàng hiện tại

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

  1. sau đó nếu tôi không thể tìm thấy nó (không có id) và có một ___from_storetham số

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

  1. cố gắng tải một bản viết lại cho ___from_store:

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

  1. nếu tìm thấy nó, nó sử dụng id_pathđể tải cái cho cửa hàng hiện tại:

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

Mọi thứ đều ổn tuy nhiên có vấn đề trong dữ liệu url_rewrite và do đó với chức năng chỉ mục (ít nhất là đối với các sản phẩm có thể định cấu hình):

  • ngay cả khi chúng tôi đang chuyển đổi cửa hàng và cửa hàng mới có url khác nhau, một dòng ghi lại ở dòng 139 được tải.

Vấn đề là việc viết lại này trỏ đến sai id_path(thay vì chỉ vào id sản phẩm có thể định cấu hình, nó đang trỏ đến một trong những id sản phẩm đơn giản của nó)

Bây giờ một cách giải quyết là loại bỏ !$this->_rewrite->getId()điều kiện và vì vậy magento cố gắng tìm chuyển hướng luôn khi có $fromstoretham số

  • Cách tốt nhất là sửa catalog_urlchỉ mục và xóa sai viết lại mà nó tạo ra.

Ở đây mã cho cách giải quyết nhanh (bạn sẽ cần phải tạo một mô-đun và viết lại Mage_Core_Model_Url_Rewrite_Requestlớp bằng chính mình):

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

Khóa URL là một thuộc tính. Bạn có thể chỉnh sửa nó từ: Danh mục -> Thuộc tính -> Quản lý thuộc tính . Tìm kiếm url_key và nhấp vào nó. Chỉnh sửa thuộc tính url_key

Thay đổi Phạm vi và Lưu.

Bây giờ bạn có thể có các khóa URL khác nhau cho các sản phẩm trên mỗi lượt xem cửa hàng.


Tôi đã cập nhật câu hỏi, bạn trả lời là tốt nhưng nó không hoạt động
Fra

Khi bạn chuyển đổi cửa hàng, bạn nên hạ cánh trên trang chủ của cửa hàng đó chứ không phải trang sản phẩm.
FlorinelChis

Nơi bạn hạ cánh giống như nơi bạn bắt đầu: nếu bạn ở trên một trang chuyên mục, bạn nên hạ cánh trên cùng một trang bằng ngôn ngữ khác
Fra

1

Vì vậy, bạn muốn thay đổi URL cho mỗi lượt xem cửa hàng?

Hiện tại, bạn đã sửa đổi URL sản phẩm ở phạm vi điểm cho cửa hàng tiếng Pháp của bạn khác với cửa hàng tiếng Anh của bạn? Và khi bạn chuyển đổi giữa hai người, bạn sẽ nhận được 404. Đây sẽ là hành vi được mong đợi.

Magento sẽ không lưu trữ các URL khác nhau để xem các cửa hàng khác. Vì vậy, khi bạn nhấn/french/product1 vào cửa hàng Pháp, URL sẽ khớp trong bảng và nó sẽ tải. Nhưng khi bạn nhấn nó trong cửa hàng tiếng Anh, sẽ không có kết quả trùng khớp và do đó sẽ là 404.

Điều có vẻ như bạn cần là chỉ "Thêm mã cửa hàng vào URL" - sẽ để lại các khóa URL của bạn, nhưng tiền tố tất cả các URL tương ứng với mã cửa hàng của bạn. Điều này sau đó sẽ cho phép trình chuyển đổi cửa hàng của bạn hoạt động.


1
theo xác nhận của Vinai, đây là một lỗi
Fra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.