Heroku如何设置文档根目录?

5
如果我有这样的目录结构:
/
/libraries/
/other-nonpublic-stuff/
/webroot/

我该如何将/webroot/设置为文档根目录,以便在我的Heroku应用程序的URL下仅提供其内容?

我认为Procfile可能是实现这一目标的方法,但它并没有很好地记录。已经尝试了以下方法:

web: php webroot/

或者

web: sh boot.sh webroot/

或者

web: sh webroot/

Procfile中指定了,但我总是得到Heroku push rejected, no Cedar-supported app detected的错误提示。
当我推送一个在根目录下有"index.php"文件的仓库时,一切都正常,heroku ps命令只显示一个运行着 "boot.sh" 的web进程,但即使如此,Procfile显然被忽略了,而 heroku 运行的是 "/" 而不是 "/webroot"。 因此无法提示我如何设置Procfile
Process  State      Command     
-------  ---------  ----------  
web.1    up for 2h  sh boot.sh  

我通过heroku run bash登录我的"实例"控制台,并执行了cat boot.sh,其内容如下:

sed -i 's/Listen 80/Listen '$PORT'/' /app/apache/conf/httpd.conf
for var in `env|cut -f1 -d=`; do
  echo "PassEnv $var" >> /app/apache/conf/httpd.conf;
done
touch /app/apache/logs/error_log
touch /app/apache/logs/access_log
tail -F /app/apache/logs/error_log &
tail -F /app/apache/logs/access_log &
export LD_LIBRARY_PATH=/app/php/ext
export PHP_INI_SCAN_DIR=/app/www
echo "Launching apache"
exec /app/apache/bin/httpd -DNO_DETACH

因此,当根目录中没有.php文件时,出现“Heroku push rejected, no Cedar-supported app detected”错误的问题显然可以通过将“PHP_INI_SCAN_DIR”更改为“/app/www/webroot”来解决,但这是不可能的,并且不能解决使用“/webroot”作为文档根目录的问题。为了解决这个问题,我还需要修改“/app/apache/conf/httpd.conf”。
有什么建议吗? :)
谢谢, Josh

3
自从一段时间以来,他们默默支持cedar托管平台上的php。由于他们正在与Facebook合作,我猜我可以用Procfile实现这个目标,但是具体使用方式没有文档说明。 - Josh
不再那么沉默。PHP在这里声明:http://devcenter.heroku.com/articles/facebook - Josh
看起来 Procfile 对于 PHP 应用程序被彻底忽略了。 :-( - Josh
他们是否也默默地支持Common Lisp? - Adam Arold
嘿,伙计!我在使用 Nginx 时遇到了相同的问题。但是我仍然卡住了。你有成功吗? - Pablo
显示剩余3条评论
3个回答

5
实际上,这归结于创建一个自定义的boot.sh文件,并将Procfile指向运行该文件而不是默认文件。我已经在github上用最基本的结构把它全部整合到了一起:https://github.com/winglian/Heroku-PHP 它还包括使用您自己的conf文件的钩子,所以请随意尝试并让我知道!

5
您需要使用 mod_rewrite 在 Heroku 上从 "webroot" 提供内容。请尝试在您的 .htaccess 文件中添加以下内容:
RewriteEngine On

RewriteRule ^\.htaccess$ - [F]

RewriteCond %{REQUEST_URI} =""
RewriteRule ^.*$ /webroot/index.php [NC,L]

RewriteCond %{REQUEST_URI} !^/webroot/.*$
RewriteRule ^(.*)$ /webroot/$1

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ - [NC,L]

RewriteRule ^public/.*$ /webroot/index.php [NC,L]

为了解决“未检测到Cedar支持的应用程序”错误,我只需在存储库的根目录中创建一个新的index.php文件。这个文件包含什么并不重要,但我会添加一些提醒来记录我的应用程序设置细节。
希望这有所帮助!

3
web: vendor/bin/heroku-php-apache2 webroot/

在您的项目根目录下创建名为Procfile(无扩展名)的文件,并将以下行添加到其中。然后将Procfile推送到您的Heroku存储库中。这个解决方案对我很有效。 - Fizk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接