我需要在生产服务器上的嵌套目录中部署Symfony 2项目。实际上,这意味着所有URL都以/ subdirectory / path为前缀,即
http://host.com/subdirectory/project/web/app.php/survey
我不需要重写URL,也不打算进行设置。只有通过上述网址访问时,该应用才有效。
我遇到的问题是path
和asset
Twig函数生成的所有链接都与服务器根目录( / )相关,而不是项目所在的子目录( /子目录/ )。 Symfony 2中是否有任何配置参数覆盖全局的相对路径?
我尝试通过添加HTML标记解决该问题,但它不适用于链接。
更新:我欠你的更多细节。我正在使用其mod_rewrite版本运行IIS,因此您的部分建议可能仍然有效。
更新:理想情况下,我希望看到一个在AppKernel对象上设置root目录的解决方案 - 方法AppKernel::setRootDir()
已存在以补充现有的AppKernel::getRootDir()
。
答案 0 :(得分:3)
奇怪...使用默认配置,路径/资产应该处理子目录。你是否已经开始使用symfony发行版进行了尝试?在localhost上,我主要以这种方式使用它。 你介意发布你的配置文件吗?
总之... 对于您可以尝试配置的资产路径:
#config.yml
templating:
assets_base_urls: { http: "http://yoursite.com/dir1", ssl: "https://yoursite.com/dir1" }
(http://symfony.com/doc/current/reference/configuration/framework.html#assets-base-urls)
对于路由器,您应该阅读:http://symfony.com/doc/current/cookbook/console/sending_emails.html#configuring-the-request-context-globally 它可以为您提供有关更改路由器上下文的一些想法,如:
# app/config/parameters.yml
parameters:
router.request_context.host: example.org
router.request_context.scheme: http
router.request_context.base_url: my/path
无论如何 - 根据请求信息自动设置上下文。尝试调试:
$context = $this->getContainer()->get('router')->getContext();
// you should be mainly interested in:
$context->getBaseUrl();
可以轻松创建监听器类,无论如何它都会手动设置你的基本URL:
class RouterContextListener {
protected $router;
public function __construct(RouterInterface $router)
{
$this->router = $router;
}
public function onKernelRequest(Event $event)
{
$this->router->setBaseUrl('somedir');
}
}
答案 1 :(得分:2)
您正在寻找RewriteBase规则,请将其添加到您的.htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /subdirectory/project/web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>
另请查看symfony-standard 2.3 .htaccess文件,mb可以提供帮助
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]
# Rewrite all other queries to the front controller.
RewriteRule .? %{ENV:BASE}/app.php [L]
</IfModule>
答案 2 :(得分:0)
查看app / config / routing.yml,从捆绑包中导入路由。该文件中的记录看起来与此类似:
somename:
resource: "@YourBundle/Resources/config/routing.yml"
prefix: /
您可以在前缀中添加子目录,例如prefix: /subdirectory
然后,所有生成的网址都将包含subdirectory
。
答案 3 :(得分:0)
要启用重写模块,请运行“apache2 enable module rewrite”:
sudo a2enmod rewrite
您需要重新启动网络服务器才能应用更改:
sudo service apache2 restart
VirtualHost应该是这样的 ServerName localhost.myproject.dev ServerAdmin webmaster @ localhost
DocumentRoot /var/www/project_path
<Directory /var/www/project_path>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /app.php [QSA,L]
</IfModule>
</Directory>
此选项重定向index.php,index.html或其他:
Options Indexes FollowSymLinks MultiViews
它会重写你的htacces!
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /app.php [QSA,L]
</IfModule>
答案 4 :(得分:0)
我在本地环境中的解决方案是在app/config/config.yml
framework:
assets:
base_urls:
- 'http://localhost/symfony_dir/'
不需要重写!