Apache / Symfony2:将除少数路由和/之外的所有内容重定向到另一台主机

时间:2016-08-26 15:44:28

标签: php symfony mod-rewrite apache2

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

在子域名(.xxx)上,我们希望将之外的所有内容//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的重写周期(不匹配这两个规则因此被转发) )。

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

1 个答案:

答案 0 :(得分:0)

一个相当&#34;脏&#34;解决这个问题,考虑到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]