Commit e7e98bd5 authored by Josh Mervine's avatar Josh Mervine

adding interpolation to redirects

parent 9ff0c2cd
...@@ -82,6 +82,25 @@ With custom redirects, you can move pages to new routes but still preserve the o ...@@ -82,6 +82,25 @@ With custom redirects, you can move pages to new routes but still preserve the o
} }
``` ```
##### Interpolating Env Var Values
It's common to want to be able to test the frontend against various backends. The `url` key supports environment variable substitution using `${ENV_VAR_NAME}`. For instance, if there was a staging and production Heroku app for your API, you could setup the config above like the following:
```json
{
"redirects": {
"/old/gone/": {
"url": "${NEW_SITE_DOMAIN}/new/here/"
}
}
}
```
Then using the [config vars](https://devcenter.heroku.com/articles/config-vars), you can point the frontend app to the appropriate backend. To match the original proxy setup:
```bash
$ heroku config:set NEW_SITE_DOMAIN="https://example.herokapp.com"
```
#### Custom Error Pages #### Custom Error Pages
You can replace the default nginx 404 and 500 error pages by defining the path to one in your config. You can replace the default nginx 404 and 500 error pages by defining the path to one in your config.
......
...@@ -30,11 +30,18 @@ class NginxConfig ...@@ -30,11 +30,18 @@ class NginxConfig
uri.path = "" uri.path = ""
json["proxies"][loc]["host"] = uri.to_s json["proxies"][loc]["host"] = uri.to_s
end end
json["clean_urls"] ||= DEFAULT[:clean_urls] json["clean_urls"] ||= DEFAULT[:clean_urls]
json["https_only"] ||= DEFAULT[:https_only] json["https_only"] ||= DEFAULT[:https_only]
json["routes"] ||= {} json["routes"] ||= {}
json["routes"] = NginxConfigUtil.parse_routes(json["routes"]) json["routes"] = NginxConfigUtil.parse_routes(json["routes"])
json["redirects"] ||= {} json["redirects"] ||= {}
json["redirects"].each do |loc, hash|
json["redirects"][loc].merge!("url" => NginxConfigUtil.interpolate(hash["url"], ENV))
end
json["error_page"] ||= nil json["error_page"] ||= nil
json["debug"] ||= ENV['STATIC_DEBUG'] json["debug"] ||= ENV['STATIC_DEBUG']
json.each do |key, value| json.each do |key, value|
......
...@@ -3,6 +3,10 @@ ...@@ -3,6 +3,10 @@
"/old/gone": { "/old/gone": {
"url": "/", "url": "/",
"status": 302 "status": 302
},
"/old/interpolation": {
"url": "${INTERPOLATED_URL}",
"status": 302
} }
} }
} }
...@@ -89,6 +89,12 @@ RSpec.describe "Simple" do ...@@ -89,6 +89,12 @@ RSpec.describe "Simple" do
expect(response.code).to eq("302") expect(response.code).to eq("302")
expect(response["location"]).to eq("http://#{AppRunner::HOST_IP}/") expect(response["location"]).to eq("http://#{AppRunner::HOST_IP}/")
end end
it "should redirect using interpolated urls" do
response = app.get("/old/interpolation")
expect(response.code).to eq("302")
expect(response["location"]).to eq("http://#{AppRunner::HOST_IP}/interpolation.html")
end
end end
describe "https only" do describe "https only" do
......
...@@ -23,14 +23,18 @@ class AppRunner ...@@ -23,14 +23,18 @@ class AppRunner
@run = false @run = false
@debug = debug @debug = debug
env.merge!("STATIC_DEBUG" => true) if @debug env.merge!("STATIC_DEBUG" => true) if @debug
# support interpolation specs
env.merge!("INTERPOLATED_URL" => "/interpolation.html")
@container = Docker::Container.create( @container = Docker::Container.create(
'Image' => BuildpackBuilder::TAG, "Image" => BuildpackBuilder::TAG,
'Cmd' => ["bash", "-c", "cp -rf /src/* /app/ && /app/bin/boot"], "Cmd" => ["bash", "-c", "cp -rf /src/* /app/ && /app/bin/boot"],
# Env format is [KEY1=VAL1 KEY2=VAL2] # Env format is [KEY1=VAL1 KEY2=VAL2]
'Env' => env.to_a.map {|i| i.join("=") }, "Env" => env.to_a.map {|i| i.join("=") },
'HostConfig' => { "HostConfig" => {
'Binds' => ["#{fixtures_path(fixture)}:/src"], "Binds" => ["#{fixtures_path(fixture)}:/src"],
'PortBindings' => { "PortBindings" => {
"#{CONTAINER_PORT}/tcp" => [{ "#{CONTAINER_PORT}/tcp" => [{
"HostIp" => HOST_IP, "HostIp" => HOST_IP,
"HostPort" => HOST_PORT, "HostPort" => HOST_PORT,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment