在Framework中包装遗留应用程序

时间:2015-08-13 06:40:41

标签: .htaccess symfony mod-rewrite legacy

我有一个遗留应用程序,代码错误且非常未经测试。这是一个很大的,所以我们没有人力来一步开发新版本。

所以我想将它包装到Symfony应用程序中并在Symfony中编写新的部分。然后将逐步重构旧类。

如果symfony触发404,我试图将legacys前控制器包含在应用程序中。这很有效。 但如果我现在使用该应用程序,我的旧路由系统和symfonys .htaccess会出错。

symfony .htaccess看起来像这样

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]

传统.htaccess看起来像这样

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !\.(css|jpg|png|gif|js|xml)$ [NC]
RewriteRule ^(.*)$ index.php?_shop_=$1 [L,QSA]

_shop_参数用于路由等,旧应用程序的路由器依赖于它。 知道我怎么能一起来这个?

1 个答案:

答案 0 :(得分:1)

如果要在.htaccess中修复此问题,则必须定义有效路由。

假设您的旧应用程序具有以下可能的路由和重定向:

/listing => index.php?shop=listing
/detail => index.php?shop=detail
/cart => index.php?shop=cart

然后你希望你的.htaccess看起来像这样

RewriteCond %{REQUEST_FILENAME} (listing|detail|cart)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !\.(css|jpg|png|gif|js|xml)$ [NC]
RewriteRule ^(.*)$ index.php?_shop_=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]

如果这一行太简单,无法满足您的需求,您可以利用在重写规则中OR标志具有更高优先级的事实,并编写如下内容:

RewriteCond %{REQUEST_FILENAME} ^listing/something$ [OR]
RewriteCond %{REQUEST_FILENAME} ^detail/[complexRegex] [OR]
RewriteCond %{REQUEST_FILENAME} ^cart/...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !\.(css|jpg|png|gif|js|xml)$ [NC]
RewriteRule ^(.*)$ index.php?_shop_=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]

如果你想要更高级的东西,你必须在应用程序级别(即在index.php或app.php中)而不是在.htaccess

中处理它。