簡體   English   中英

適用於舊應用程序的重寫規則的Apache重寫規則,用於在子目錄中運行Symfony應用程序

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

版本信息:Ubuntu上的Apache v2.4.18,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=$1 [L,QSA]
    RewriteRule ^/([a-z0-9-]+)/([a-z0-9-\.]+/?)$  /index.php?param1=$1&param2=$2 [L,QSA]
    RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=$1&param2=$2&param3=$3 [QSA]

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

我想做的是安裝一個Symfony應用程序以在子目錄中工作。 我已經在/ var / www / symfony-app中創建了我的Symfony應用程序,並創建了一個指向/ var / www / symfony-app / web的符號鏈接/ var / www / my-site / com / my-symfony

然后,我在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-詳細信息,我從現有應用程序中獲取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和用於Symbolic鏈接的RewriteBase的“ Location”標簽來按預期工作。 有關信息,請在下面進行最終的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=$1 [L,QSA]
    RewriteRule ^/([a-z0-9-]+)/([a-z0-9-\.]+/?)$  /index.php?param1=$1&param2=$2 [L,QSA]
    RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=$1&param2=$2&param3=$3 [QSA]

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM