【问题标题】:Apache / Symfony2: Redirect everything besides few routes and / to another hostApache / Symfony2:将除少数路由和/之外的所有内容重定向到另一台主机
【发布时间】:2017-01-03 08:21:13
【问题描述】:

在 Apache2.4 上托管 Symfony2 应用程序(在 prod 上为 fpm,在 devel 上为 mod_php)。

在子域 (.xxx) 上,我们希望将 除了 URI //sp(.*) 的所有内容重定向到我们的主域 (.com)。不幸的是,没有办法否定 RedirectMatch 中的匹配表达式,这将使这成为可能:

<VirtualHost *:80>
   ServerName  www.lsk.xxx
   RedirectMatch 301 !^(/$)|(/sp(.*))$ http://www.lsk.com/$1
   # ! is not possible here.
</VirtualHost>

<VirtualHost *:80>
   ServerName www.lsk.com
</VirtualHost>

我找到了一个表达式,它只允许我重定向 /sp 页面,但不考虑根 /。 (那个是我最喜欢的,但是如何编写一个还考虑/ 的正则表达式??):

RedirectMatch 301 ^/((?!sp).*)$ http://www.lsk.com/$1 

接下来我们去mod_rewrite:

RewriteCond %{REQUEST_URI} ^/$ [OR]
RewriteCond %{REQUEST_URI} ^/sp
RewriteRule ^.*$ - [PT,L]

RewriteRule ^.*$ http://www.lsk.com/$1 [L,R=301]

所以//sp 将强制通过,其他所有内容将被重定向到另一个主机。但是,这不起作用:最后一行仍然在 //sp 上进行评估!查看重写日志后,这似乎是由于我们 Symfony2 框架的重写规则(首页控制器)强制重写引擎开始另一个包含 app[_dev].php 的重写周期(不匹配这两个规则,因此被转发)。

我们已经通过附加与框架特定请求 uri 匹配的条件“解决”了这个问题(请参阅我的下一个答案),但我发现该修复不是很聪明,因为它将应用程序知识引入了我的基础架构。有人知道更好的解决方法吗?

【问题讨论】:

    标签: php symfony mod-rewrite apache2


    【解决方案1】:

    考虑到 Symfony2 的第二次重写周期,这是一个相当“肮脏”的修复:

    RewriteCond %{REQUEST_URI} ^/$ [OR]
    RewriteCond %{REQUEST_URI} ^/sp [OR]
    RewriteCond %{REQUEST_URI} ^/app # yuck
    RewriteRule ^.*$ - [PT,L]
    
    RewriteRule ^.*$ http://www.lsk.com/$1 [L,R=301]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 2012-05-28
      • 2012-02-25
      • 2016-03-12
      相关资源
      最近更新 更多