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]=Londonu0026amp;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('MySearchBundleFormTypeSearchType',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 它运行得很好,但是如果将它与通常在.htaccess中的单个规则(仍然无法正常工作)进行比较,那么只有这个URL重写的代码和工作量会变得非常繁重 我将不得不修改搜索表单所指向的位置 我怀疑它是最好的解决方案,因为它非常复杂,只是为了这么简单的任务. 谁变得更好? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |