簡體   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