php – 使用Symfony Routing从.htaccess重写URL

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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]=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]
.....

解决方法

所以我发现了一些东西
这比.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
但是返回/ SearchEngine的结果?search_action [city] = Kyoto& search_action [radius] = 25

它运行得很好,但是如果将它与通常在.htaccess中的单个规则(仍然无法正常工作)进行比较,那么只有这个URL重写的代码和工作量会变得非常繁重

我将不得不修改搜索表单所指向的位置

我怀疑它是最好的解决方案,因为它非常复杂,只是为了这么简单的任务.

谁变得更好?

脚本宝典总结

以上是脚本宝典为你收集整理的php – 使用Symfony Routing从.htaccess重写URL全部内容,希望文章能够帮你解决php – 使用Symfony Routing从.htaccess重写URL所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。