在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匹配的条件(请参阅我的下一个答案),但我发现修复不是很聪明,因为它将应用程序知识引入我的基础结构。任何人都知道更好的方法吗?
答案 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]