繁体   English   中英

使用Symfony路由从.htaccess重写URL

[英]URL Rewriting from .htaccess with Symfony Routing

我在Symfony(2.8)的RewritingUrl中遇到了一些麻烦。我的目标是重定向一些URL, 无需在浏览器栏中进行更改。

我需要这样做,因此URL可能具有自定义,人类可读的形式并且可以共享。

该URL也用在Form中,因此为什么以?param=data形状发送?param=data

不管怎样,Symfony的内部路由似乎不太适合它(或者我忽略了一些东西,但是我整天都在为此寻找并找到合适的答案)

如果没有框架,则在.htaccess中,如果用户转到

www.website.com/search/London/15

我会将他们重定向到

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

无需更改浏览器URL,就可以使用简单的RewriteRule来显示searchEngine

 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尝试查找内部/ Search路由,该路由不存在,因为URL旨在通过.htaccess静默重定向到SearchEngin

SearchEngine路由确实存在,并且www.website.com/SearchEngine?search_action[city]=London&search_action[radius]=15效果很好

到目前为止,如果我将R标志添加到RewriteRule,则.htaccess和Symfony可以一起使用

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

但这是因为URL在重定向到SearchEngine时在浏览器中发生了变化。

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

任何人都知道我应该为此做些什么?

路由

确实很基本,只有一个Route才具有该URL可读功能和Search,没有什么花哨的。

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的规则更长的内容,但找不到其他解决方法。

我创建了一条新路线,该路线会将/search/London/15查询转发给SearchEngine

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

控制者

在Controller Action中,我检索传递给Request:ParameterBag;的URL属性(city和radius)。 然后我将其转发给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重写的代码和工作量就变得非常繁重。

而且我将不得不修改“搜索表”直接指向的位置

我怀疑它是否是最好的解决方案,因为它对于完成如此简单的任务非常复杂。

有人好起来吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM