[英]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¶m2=$2 [L,QSA]
RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=$1¶m2=$2¶m3=$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¶m2=$2 [L,QSA]
RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=$1¶m2=$2¶m3=$3 [QSA]
<Directory />
Options FollowSymLinks
AllowOverride None
ErrorDocument 404 /404.php
</Directory>
</VirtualHost>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.