Magento 1.6+创建订单和退货页面(www.yourstore.com/sales/guest/form/)并在页脚中放置链接。
通过在local.xml(see this stackoverflow answer)中添加布局更新,可以轻松删除页脚中的链接。
但页面仍然存在,可以被Google编入索引,应该删除。如何通过代码删除此默认Magento页面?
修改 我想澄清一点,我不是在寻找重定向,重写或404类型的答案。我正在寻找一种方法来首先删除或覆盖创建此页面的任何功能,因此它永远不会被创建。我的理论是,如果存在创建它的功能,那么应该有一种方法来删除该功能。我知道还有其他通过重写等方法隐藏URL的方法。但在我看来,首选方法是不创建不需要的页面,然后再隐藏它们。我认为Magento有一些不产生它产生的页面的方法。类似于local.xml如何删除不需要的代码块。是否有类似的方法来防止首先创建不需要的页面?
答案 0 :(得分:3)
最简单的方法是使用URL重写将请求重新路由到Magento的404页面。在.htaccess文件中,在RewriteEngine on
之后和其他重写规则之前添加以下两行:
RewriteCond %{REQUEST_URI} ^/sales/guest/form
RewriteRule .* errors/404.php
如果您只需要从一个站点中删除此功能,您可以将其包含在Apache的<If>
语法中,如下所示:
<If "%{HTTP_HOST} != 'www.example.com'">
RewriteCond %{REQUEST_URI} ^/sales/guest/form
RewriteRule .* errors/404.php
</If>
如果您更喜欢使用PHP代码,其他替代方法包括覆盖Mage_Sales_GuestController类以返回重定向到404页面。或者您可以操作路由器以在路由发生之前从路由表中删除URL。与.htaccess解决方案相比,这两者都要复杂得多。
答案 1 :(得分:2)
您可以使用local.xml方法将/ sales / guest / form / page的内容替换为其他内容。例如,您可以将此句柄放在那里......
<sales_guest_form>
<reference name="content">
<!-- Remove the main content of the page, which is the form -->
<remove name="guest.form" />
<!-- Optionally you can add in your own block or set of blocks. Not sure I would though -->
<block type="yourmodlulealias/some_class" template="whatever/template.phtml" />
</reference>
</sales_guest_form>
这将删除整个客人表单,并将其替换为您自己选择的块。哎呀,你甚至不需要添加自己的块。
另一个想法是创建一个侦听controller_action_predispatch_sales_guest_form事件的观察者,并在它被触发时重定向。在此页面的主要处理发生之前触发此事件。所以config.xml可能会有类似的东西......
<controller_action_predispatch_sales_guest_form>
<observers>
<seo_redirect>
<type>singleton</type>
<class>yourmodulealias/observer</class>
<method>redirectRequest</method>
</seo_redirect>
</observers>
</controller_action_predispatch_sales_guest_form>
然后你的观察者类会看起来像这样......
class Yourcompany_Yourmodulename_Model_Observer {
public function redirectRequest($observer){
header("Location: " . Mage::getUrl() . 'someplace-else');
}
}
如果你不喜欢重定向的想法,你可能会发疯并退出:)
修改强> 如果您已经死定,看起来该页面不存在,那么也许您可以返回404状态。当Web服务器获取对服务器上不存在的文档的请求时,它通常返回404.换句话说,404表示该文档不存在。要做到这一点,您可以使用上面的观察者想法,只需将上面的重定向替换为:
class Yourcompany_Yourmodulename_Model_Observer {
public function redirectRequest($observer){
Mage::app()->getResponse()->setHeader('HTTP/1.1','404 Not Found');
Mage::app()->getResponse()->setHeader('Status','404 File not found');
exit;
}
}
当您点击浏览器中的页面时,它将完全为空白,并且http标头会说它找不到404。另一种类似的方法是使其显示Magento的默认404页面。我之前没有这样做,但我想你首先需要覆盖控制器(app / code / core / Mage / Sales / controllers / GuestController)(如果你不熟悉的话,查看如何覆盖控制器,它与重写模型和块不同)。您只需覆盖该类中的formAction()函数。它可能是这样的:
public function formAction()
{
$this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
$this->getResponse()->setHeader('Status','404 File not found');
$this->loadLayout();
$this->renderLayout();
}
除了此更改之外,您还需要更新local.xml文件中的布局句柄,使其看起来像句柄(位于cms.xml布局文件中)。所以它看起来像这样。
<sales_guest_form>
<remove name="right"/>
<remove name="left"/>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
<reference name="content">
<block type="core/template" name="default_no_route" template="cms/default/no-route.phtml"/>
</reference>
</sales_guest_form>
同样,我还没有测试过最后一种方法,但它应该可以正常工作。点击http://yousite.com/sales/guest/form会将您带到同一个Magento 404页面,就好像您访问了其他一些不存在的网址,例如http://yoursite.com/some-non-existent-url。
答案 2 :(得分:1)
发布另一个答案,因为评论太长了......
任何不存在的文件(例如js / css等).htaccess重写将重定向Magento的请求处理过程(从index.php开始)。因此,任何URL(如sales / guest / form)都会触及Magento请求处理程序,无论它是否由Magento定义。此时,如果它与Magento控制器操作匹配或可以路由到Magento控制器,Magento会生成相应的页面。如果无法将URL解析为控制器操作,Magento将生成404页面。
因此,任何以404结果响应且不允许控制器操作运行的解决方案在功能上与“删除”页面相同。