php – 使用Symfony Routing从.htaccess重写URL

我在使用Symfony RewritingUrl时遇到了一些麻烦(2.8)

我的目标是重定向某些URL,而不必在浏览器栏中更改它们.

我需要这个,所以URL可能有一个自定义的,人类可读的形式,并且可以共享.

URL也用在表单中,因此数据以?param = data形式发送

Homewever,Symfony的内部路由似乎不太适合它(或者我可能忽略了一些东西,但我整天都在寻找这个,而没有找到正确的答案)

没有框架,在.htaccess中
如果用户去了

www.website.com/search/London/15

我会将它们重定向到

www.website.com/searchEngine?search_action[city]=London&search_action[radius]=15

在不改变浏览器URL的情况下,使用简单的RewriteRule显示searchEngine nevers

 RewriteRule ^search/(.*)/(.*)$/searchEngine?search_action[city]=$1&search_action[radius]=$2 [L]

但是,一旦我尝试与Symfony使用相同的规则(在/ web forlder中的.htaccess,对吧?),

www.website.com/search/London/15登陆Symfony 404错误页面

我的猜测是Symfony试图查找内部/搜索路由,这个路径不存在,因为URL旨在通过.htaccess静默重定向到SearchEngin

SearchEngine路线确实存在且www.website.com/SearchEngine?search_action[city]=London\u0026amp;search_action[radius]=15工作得很好

到目前为止,如果我将R标志添加到RewriteRule中,.htaccess和Symfony一起工作

 RewriteRule ^search/(.*)/(.*)$/searchEngine?search_action[city]=$1&search_action[radius]=$2 [R,L]

但那是因为当URL被重定向到SearchEngine时,URL会在浏览器中发生变化.

有没有办法让Symfony知道/ search / London / 15会导致SearchEngine?search_action [city] = London& search_action [radius] = 15,并且在没有Url更改的情况下工作?

任何人都知道我应该为此调整什么?

路由

非常基本的,单一路由只是为了这个URL可读功能和搜索,没有什么太花哨.

使用routing.yml

research_action:
path:     /SearchEngine
defaults: { _controller: "MySearchBundle:Search:search" }

SearchController:searchAction

public function searchAction(Request $request)
{
    /*
       expect search_action[city]=London and search_action[radius]=15
    */
    $form = $this->createForm('MySearchBundle\Form\Type\SearchType',null);
    $form->handleRequest($request);
    if($form->isSubmitted() && $form->isValid())
    {
         //Get here without problem when from SearchEngine?search_action[city]=London&search_action[radius]=15
           /* 
               This is where Zhuli do the thing
             */

    }
  return $this->render('SomeDefaultPage.html.twig');
}

的.htaccess

...
//Basic Symfony Routing stuff
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]
#Doesn't work without that R tag
RewriteRule search/(.*)/(.*)$/SearchEngine?search_action[city]=$1&search_action[radius]=$2 [R=301,L]
# Rewrite all other queries to the front controller.
RewriteRule .? %{ENV:BASE}/app.php [L]
.....

最佳答案 所以我发现了一些东西

这比.htaccess中的规则要长得多,但我找不到另一种解决方法.

我创建了一个新的Route,它将/ search / London / 15查询转发给SearchEngine

forward_action:
path:     /search/{city}/{radius}
defaults: { _controller: "MySearchBundle:Search:searchForward" }

调节器

在Controller Action中,我检索传递给Request:ParameterBag的URL属性(城市和半径);然后我转发到SearchEngineAction

  public function searchForwardAction(Request $request,$city,$radius)
  {
        //Putting the attribute in an array
        $query['city']=$city;
        $query['radius']=$radius;
        /*
           Which I pass to the request as a parameter
           The forward will treat this like a Get Query
           ?search_action[city]=$city&search_action[radius]=$radius
         */
        $request->query->set('search_action',$query);
        //Forwarding !
        return $this->forward('MySearchBundle:Search:search',  array('request' => $request));
}

由于我使用forward(),浏览器上的URL保持为/ Search / Kyoto / 25
但是返回/ SearchEngine的结果?search_action [city] = Kyoto& search_action [radius] = 25

它运行得很好,但是如果将它与通常在.htaccess中的单个规则(仍然无法正常工作)进行比较,那么只有这个URL重写的代码和工作量会变得非常繁重

我将不得不修改搜索表单所指向的位置

我怀疑它是最好的解决方案,因为它非常复杂,只是为了这么简单的任务.

谁变得更好?

点赞