当遗留应用程序的重写规则已经存在时,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=¶m2= [L,QSA]
RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=¶m2=¶m3= [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=¶m2= [L,QSA]
RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=¶m2=¶m3= [QSA]
<Directory />
Options FollowSymLinks
AllowOverride None
ErrorDocument 404 /404.php
</Directory>
</VirtualHost>
版本信息: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=¶m2= [L,QSA]
RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=¶m2=¶m3= [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=¶m2= [L,QSA]
RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/(.+)$ /index.php?param1=¶m2=¶m3= [QSA]
<Directory />
Options FollowSymLinks
AllowOverride None
ErrorDocument 404 /404.php
</Directory>
</VirtualHost>