將靜態文件部署到 Heroku
如果您在相同的域上使用 Ruby on Rails、Django 或 NodeJS 框架,它們有特殊的文件夾,通常稱為 static , 公開 或資產 .但是,如果您只部署通常不是那麼靜態的“靜態”文件呢?順便說一句。
Heroku 使用 Cedar 堆棧作為應用程序創建工具,它不支持靜態文件的平面部署,例如 HTML、CSS 或 JavaScript,除非它們帶有一些服務器端語言,例如 PHP、Ruby、Python。如果您使用使用 jQuery 或 BackboneJS 框架和服務(如 Parse.com 或 Firebase.com)構建的前端應用程序,或者使用您自己的後端部署為不同實例和/或域上的不同應用程序,這可能會派上用場。
有多種方法可以誘使 Heroku 和 Cedar 認為您的 HTML、CSS 和 JavaScript 文件是 PHP 或 Ruby on Rails 或任何其他合法的 Cedar 堆棧應用程序。這裡最簡單的方法是創建index.php 項目文件夾中的文件,與 .git 處於同一級別 文件夾。您可以使用以下命令在終端中執行此操作:
$ touch index.php
然後我們用 .htaccess 關閉 PHP 指示。您可以將行添加到 .htaccess 並使用此終端命令創建它:
$ echo 'php_flag engine off' > .htaccess
這兩個終端命令將創建空 index.php 文件和 .htaccess 關閉 PHP 的文件。這個解決方案是由 Kenneth Reitz 發現的。
另一種方法不太優雅,但也涉及 PHP。在要發布/部署到 Heroku 的項目文件夾中創建與 index.html 相同級別的文件 index.php,內容如下:
<?php echo file_get_contents('index.html'); ?>
第三種方式是使用 Ruby 和 Ruby Bamboo 堆棧。在這種情況下,我們需要以下結構:
-project folder config.ru /public index.html /css app.js ...
index.html 中 CSS 和其他資源的路徑應該是相對的。即'css/style.css'。 config.ru 文件應包含以下代碼:
use Rack::Static, :urls => ["/stylesheets", "/images"], :root => "public" run lambda { |env| [ 200, { 'Content-Type' => 'text/html', 'Cache-Control' => 'public, max-age=86400' }, File.open('public/index.html', File::RDONLY) ] }
有關詳細信息,您可以參考 Bamboo Heroku 官方文檔。
最後但同樣重要的是,對於 Python 和 Django 開發人員,您可以將以下內容添加到您的 urls.py :
urlpatterns += patterns(”, (r’^static/(?P.*)$’, ‘django.views.static.serve’, {‘document_root’: settings.STATIC_ROOT}),)
或者使用這個 Procfile 行:
web: python my_django_app/manage.py collectstatic --noinput; bin/gunicorn_django --workers=4 --bind=0.0.0.0:$PORT my_django_app/settings.py
完整的 Django 帖子位於在 Heroku 上管理 Django 靜態文件。
如果你使用 NodeJS,下面是如何編寫自己的服務器:
var http = require("http"), url = require("url"), path = require("path"), fs = require("fs") port = process.argv[2] || 8888; http.createServer(function(request, response) { var uri = url.parse(request.url).pathname , filename = path.join(process.cwd(), uri); path.exists(filename, function(exists) { if(!exists) { response.writeHead(404, {"Content-Type": "text/plain"}); response.write("404 Not Found\n"); response.end(); return; } if (fs.statSync(filename).isDirectory()) filename += '/index.html'; fs.readFile(filename, "binary", function(err, file) { if(err) { response.writeHead(500, {"Content-Type": "text/plain"}); response.write(err + "\n"); response.end(); return; } response.writeHead(200); response.write(file, "binary"); response.end(); }); }); }).listen(parseInt(port, 10)); console.log("Static file server running at\n => http://localhost:" + port + "/\nCTRL + C to shutdown");