【问题标题】:Can Symfony 4 be configured to ignore code installed in subdirectories?可以将 Symfony 4 配置为忽略安装在子目录中的代码吗?
【发布时间】:2020-03-05 06:34:06
【问题描述】:

我目前正在转换一个旧网站以使用 Symfony 4,并且该网站使用 LiveZilla 实时聊天应用程序。

LiveZilla 位于网站的子文件夹中,可使用 somesite.com/livezilla 下的 URL 直接访问。我目前当然不能访问它,因为我还没有为这个文件夹配置路由。所以 Symfony 决定这将是一个 404。

LiveZilla 本质上是一个完全独立的应用程序,位于此处的自己的文件夹中。它不依赖于托管它的网站。有没有办法告诉 Symfony 忽略某些路径,这样这样的代码就可以不受干扰地执行?

我有一种偷偷摸摸的感觉,我需要调整我看待这个问题的方式,因为我在 Symfony 文档中找不到任何关于这个的明显内容,而且这个框架是经过深思熟虑的。到目前为止,我想出的最好的方法是破解 public/.htaccess,但不知何故感觉不对...

【问题讨论】:

  • 如果两个网站是独立的,你真的不应该把你的旧网站放在你的 Symfony 应用程序中。相反,将您的应用程序部署在两个不同的位置并配置您的 Web 服务器来完成这项工作。例如,如果您正在运行 nginx,则可以在主网站 location 内添加一个 location 块并将其指向您的旧网站
  • 谢谢 Manu,有趣的想法。 LiveZilla 建议将他们的软件安装在使用它的站点的子目录中。最坏的情况,我猜它可以安装在(例如)子域上并从其他地方提供服务。如果我真的找不到其他方法,我会尝试。
  • 我坚持认为您的 LiveZilla 应用程序应该存在于您的 SF 应用程序之外(为什么第三方独立应用程序应该成为您的资源的一部分?),如果您想这样做,您可以获得它通过将您的 LiveZilla 应用程序放在 public/ 文件夹中来工作,是的,正如您所提到的,要么向您的 SF 应用程序 .htaccess 添加规则(例如 RewriteRule ^livezilla/(.*)$ livezilla/$1 [L]),要么正确地重新配置您的虚拟主机。我认为应该首选第二个选项。
  • 听起来像个计划!我会试试的,谢谢 Manu
  • 实施了以下建议,但还将 LiveZilla 文件添加到单独的存储库中。现在一切都好,感谢您的意见:)

标签: php symfony symfony4 livechat


【解决方案1】:

您的 .htaccess 文件应允许直接向现有文件发出请求,但不允许对目录发出请求。请参阅此规则:

# 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]

这意味着你应该能够访问 somesite.com/livezilla/index.php 但对 somesite.com/livezilla 的请求将重定向到 symfony 前端控制器.因此,请尝试更改您的链接以指向子目录中的实际文件。

编辑 .htaccess 文件以满足您的需要也没有错。您只需要一个条件来检查请求是否针对子目录,如果是,请使用与上述相同的 RewriteRule ^ - [L] 以允许该请求继续。

如果放在上述规则 (reference) 之后,以下内容应该可以工作:

RewriteCond %{REQUEST_URI} ^/livezilla/ 
RewriteRule ^ - [L]

或者这样可能更好,将此规则放在RewriteEngine On(reference) 行之后

RewriteRule ^(livezilla) - [L]

[L] 标志意味着该规则将是用于请求的最后一个

【讨论】:

  • 非常感谢 Arleigh,您的建议非常有效/给了我一直在寻找的前进方向(完全错过了您也可以添加物理文件的事实。Doh!)
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 2012-08-14
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多