[英]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.