脚本宝典收集整理的这篇文章主要介绍了php – 使用Symfony Routing从.htaccess重写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] .....
我创建了一个新的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重写的代码和工作量会变得非常繁重
我怀疑它是最好的解决方案,因为它非常复杂,只是为了这么简单的任务.
谁变得更好?
以上是脚本宝典为你收集整理的php – 使用Symfony Routing从.htaccess重写URL全部内容,希望文章能够帮你解决php – 使用Symfony Routing从.htaccess重写URL所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。