【发布时间】: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