提交表单到重写的URL?

时间:2015-02-11 23:26:46

标签: forms .htaccess magento mod-rewrite rewrite

我正在尝试为我的Magento搜索表单创建漂亮的网址,以便制作:

http://domain.com/catalogsearch/result/?q=KEYWORD

看起来像这样:

http://domain.com/search/KEYWORD

我写过这是我的htaccess文件:

RewriteRule ^search/([^/]+)/?$ /catalogsearch/result/?q=$1 [QSA,P,NC]

这很好用,当我输入http://domain.com/search/KEYWORD时,它会显示结果。

但是...

我无法锻炼如何让我的搜索表单转到漂亮的格式网址,它仍然是原始的。

我的搜索表单目前是这样的:

<form id="search_form" action="http://domain.com/catalogsearch/result/" method="get">
        <input id="search" type="search" name="q" value="KEYWORD" maxlength="128">
        <button type="submit">search</button>
</form>

正确方向的任何一点都非常赞赏。

1 个答案:

答案 0 :(得分:1)

这里有几件事情,所以让我尽力解释一下。

首先,你的主要问题是这个新的&#34;漂亮&#34;搜索网址。当<form>method="GET"一起使用时,每个输入(即<input name="q">)都会作为查询参数附加到表单的操作中(您将获得/search?q=foo /search/foo 1}}而不是<form id="search_form" action="<?php echo Mage::getUrl('search'); ?>" method="GET"> )。

为了解决这个问题,你需要做两件事:

  1. 将表单标记更改为:

    /search

    这样可以确保将表单提交给/catalogsearch/result而不是?q=foo。 (不过,你仍会获得var form = document.getElementById('search_form'), input = document.getElementById('search'); form.onsubmit = function() { // navigate to the desired page window.location = form.action + input.value; // don't actually submit the form return false; }; ,这将在#2中得到解决。)

  2. 添加一些JavaScript,劫持表单提交并形成所需的URL:

    RewriteRule
  3. 这会帮助您启动并运行,但仍有一些其他问题需要解决。

    使用基于P的重写与Magento不起作用。我还没有弄清楚技术原因,但是我遇到了同样的问题。您的重写与RewriteRule标志一起使用的原因是the P flag turns the rewrite into a proxy request。这意味着您的网络服务器会使用新网址向自己发出另一个请求,这可以避免您遇到的典型RewriteRule问题。

    那么,如何在不使用RewriteRule的情况下使用自定义漂亮网址?你使用Magento的内部重写逻辑! Magento通过其配置XML提供类似于<config> <global> <rewrite> <some_unique_identifier> <from><![CDATA[#/search/(.*)/?$#]]></from> <to><![CDATA[/catalogsearch/result/index/q/$1/]]></to> <complete /> </some_unique_identifier> </rewrite> </global> </config> 的基于正则表达式的重写逻辑:

    /search/foo

    通过将该配置放在您的某个模块中,Magento将在内部将/catalogsearch/result/index/q/foo/形式的请求重写为/。请注意,您必须使用Magento的自定义参数结构(由/catalogsearch/result/index/分隔的名称 - 值对),因为它在执行此内部重写后不会解析查询字符串参数。另请注意,您必须指定完整的模块 - 控制器 - 动作三重奏(q),否则/search/foo将被解释为动作名称,而不是参数名称。

    这比使用代理请求要好得多,因为它不会发出辅助请求,并且重写发生在Magento的核心路由处理逻辑中。

    这应该足以让你完全正确地运行在正确的道路上。但是,如果您有兴趣,可以进一步采取此一个步骤。

    通过使用上述技术,您最终会得到三个搜索网址:/catalogsearch/result/?q=foo/catalogsearch/result/q/foo<link rel="canonical">。这意味着每个搜索查询基本上有三个页面,所有页面都具有相同的内容。这对于SEO目的来说并不是很好。为了解决这个问题,您可以从后两个网址创建301永久重定向以重定向到您的漂亮网址,或者您可以使用{{1}}标记告诉搜索引擎您的漂亮网址是主要网址。

    无论如何,我希望所有这些都能帮助你并使你走上正轨!