[英]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,没有什么花哨的。
research_action:
path: /SearchEngine
defaults: { _controller: "MySearchBundle:Search:search" }
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');
}
...
//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.