我有一个遗留应用程序,代码错误且非常未经测试。这是一个很大的,所以我们没有人力来一步开发新版本。
所以我想将它包装到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_参数用于路由等,旧应用程序的路由器依赖于它。 知道我怎么能一起来这个?
答案 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
中处理它。