重定向|从旧URL转发到新URL

Rey*_*rPM -1 php .htaccess redirect url-routing symfony

我有一个路由和方法以这种方式操纵URL:

http://domain.com/combivent?email=WGA1cUtKZi4
Run Code Online (Sandbox Code Playgroud)

现在该URL已更改为此URL:

http://domain.com/?email=WGA1cUtKZi4
Run Code Online (Sandbox Code Playgroud)

但旧的电子邮件仍旧保留旧电子邮件.我需要将每个URL从旧方式重定向到新方式.例如,如果我调用它,http://domain.com/combivent?email=WGA1cUtKZi4那么我应该重定向到http://domain.com/?email=WGA1cUtKZi4如何在Symfony2中实现这一点?我可以在路由中使用任何类型的通配符,还是我需要保留这两种方法并在内部处理它?这可以在.htaccess水平上完成吗?有什么建议?

这是.htaccess看起来像:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]

    # Remove combivent word from the URL when call a brand page
    RewriteRule ^combivent?email=([^/]+)$  /?email=$1 [L,QSA,R=301]

    RewriteRule .? %{ENV:BASE}/app.php [L]    
</IfModule>
Run Code Online (Sandbox Code Playgroud)

此外,这domain.com是共享三个域的VirtualHost的别名.将VH定义视为:

ServerName maindomain.com
ServerAlias domain.com
ServerAlias domain1.com
Run Code Online (Sandbox Code Playgroud)

更新

以下是完整.htaccess定义:

DirectoryIndex app.php
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Remove combivent word from the URL when call a brand page
    RewriteCond %{QUERY_STRING} ^email=[^&]+ [NC]
    RewriteRule ^combivent/?$ / [L,R=301]

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]

    RewriteRule .? %{ENV:BASE}/app.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        RedirectMatch 302 ^/$ /app.php/
    </IfModule>
</IfModule>
Run Code Online (Sandbox Code Playgroud)

qoo*_*mao 5

.htaccess您可以将旧路由重定向到路由中的新路由,而不是深入挖掘.

new_route:
    path: /
    defaults: ...

old_route:
    path: /combivent
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: new_route
        permanent: true
Run Code Online (Sandbox Code Playgroud)

在使用注释时,您只需要命名新路由或找出生成的名称,并在"old_route"定义中使用它.

更新了您的实际设置

PDOneBundle/Resources/config/routing.yml

pdone:
    resource: "@PDOneBundle/Controller/"
    type:     annotation
    prefix:   /

# add this
combivent:
    path: /combivent
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: brand
        permanent: true
Run Code Online (Sandbox Code Playgroud)

PDOneBundle\Controller\BrandPageController

class BrandPageController extends Controller
{
    /**
     * @param Request $request
     *
     * @return array
     * @Route("/combivent", name="combivent") <!-- remove this
     * @Route("/", name="brand")
     * @Method("GET")
     * @Template()
     */
    public function indexAction(Request $request)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以将它放在您的`app/config/routing.yml`中,我假设您添加了基本注释"import".或者你可以将它放在一个特殊的`redirect.yml`文件中,然后你可以从`routing.yml`作为资源链接到该文件. (2认同)