当遗留应用程序的重写规则已经存在时,Apache 重写子目录中 运行 个 Symfony 应用程序的规则

Apache rewrite rules for running a Symfony application in a sub-directory when rewrite rules already exist for legacy application

版本信息:Apache v2.4.18 Ubuntu,PHP 版本 7.1,Symfony v3.2

几天来我一直在努力让它工作并不断遇到问题,我有一个现有的 PHP 应用程序使用自定义构建的框架和以下 Apache VirtualHost 配置:

<VirtualHost *:80>
    ServerName dvlp.mydomain.com
    DocumentRoot /var/www/my-site/com

    RewriteEngine   On

    # Do nothing for the Home page ('^/$'), specific directories, static files.
    RewriteRule ^/(?:$|shared|asset)|\.(?:php|ico|txt|xml) - [L]

    # Search engine friendly request URIs (most, but not all, without a query string).
    RewriteRule ^/([a-z0-9-]+/?)$                 /index.php?param1= [L,QSA]
    RewriteRule ^/([a-z0-9-]+)/([a-z0-9-\.]+/?)$  /index.php?param1=&param2= [L,QSA]
    RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=&param2=&param3= [QSA]

    <Directory />
            Options FollowSymLinks
            AllowOverride None
            ErrorDocument 404 /404.php
    </Directory>
</VirtualHost>

我想做的是安装一个 Symfony 应用程序以在子目录中工作。我在 /var/www/symfony-app 中创建了我的 Symfony 应用程序并创建了一个符号 link /var/www/my-site/com/my-symfony 指向/var/www/symfony-app/web.

然后我在 VirtualHost 文件的第 6 行尝试了以下操作:

RewriteRule ^/(?:$|my-symfony|shared|asset)|\.(?:php|ico|txt|xml) - [L]

在浏览器中访问 dvlp.mydomain.com/my-symfony 会将我带到 /var/www/symfony-app/web 的目录列表 文件夹。我尝试将 index.php 文件添加到 /var/www/symfony-app/web,其中仅包含 app_dev.php 并加载了主页,但我尝试访问 dvlp.mydomain.com/my-symfony/edit-personal-details 我从我现有的应用程序中得到 404 错误页面。

我现在意识到我需要为这个子目录单独的重写规则,对于 Symfony 这通常是这样写的:

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

所以我撤消了对 VirtualHost 文件第 6 行所做的更改,并添加了如下新行:

RewriteRule ^/my-symfony(.*)$ /my-symfony/index.php [L,QSA]

这会导致 404 错误:

No route found for "GET /my-symfony/" (from "http://dvlp.mydomain.com/")

如果我尝试访问 dvlp.mydomain.com/my-symfony/edit-personal-details,我会收到相同的 404 错误:

No route found for "GET /my-symfony/edit-personal-details" (from "http://dvlp.mydomain.com/")

我尝试的最后一件事是为我的 Symfony 添加前缀 routing.yml:

my_symfony:
    resource: "@MySymfonyBundle/Controller/"
    type:     annotation
    prefix:   /my-symfony

这会正确加载页面但没有图像或样式表,因为它们试图从 DocumentRoot 加载(例如 dvlp.mydomain.com/css 而不是 dvlp.mydomain.com/my-symfony/css).

对于我哪里出错的任何意见,我将不胜感激。谢谢。

我终于设法通过添加包含特定 RewriteRules 的 "Location" 标记和符号 link 的 RewriteBase 使其按预期工作。有关信息,下面是最终的 VirtualHost 配置:

<VirtualHost *:80>
    ServerName dvlp.my-domain.com
    DocumentRoot /var/www/my-site/com

    RewriteEngine On

    <Location /my-symfony>
        RewriteBase /my-symfony
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ app_dev.php [QSA,L]
    </Location>

    # Do nothing for the Home page ('^/$'), specific directories, static files.
    RewriteRule ^/(?:$|my-symfony|shared|asset)|\.(?:php|ico|txt|xml) - [L]

    # Search engine friendly request URIs (most, but not all, without a query string).
    RewriteRule ^/([a-z0-9-]+/?)$                 /index.php?param1= [L,QSA]
    RewriteRule ^/([a-z0-9-]+)/([a-z0-9-\.]+/?)$  /index.php?param1=&param2= [L,QSA]
    RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=&param2=&param3= [QSA]

    <Directory />
        Options FollowSymLinks
        AllowOverride None
        ErrorDocument 404 /404.php
    </Directory>
</VirtualHost>