README.md

# PhoenixHisto

A plug for handling client side routing in Phoenix, a.k.a. History Api fallback.

## Rationale

Single page applications use [History Api](https://developer.mozilla.org/en/docs/Web/API/History)
to enable client side routing. This plug allows for handling client side routes on the server
by rewriting requests to `index.html`.

## Requests exempt from rewrite

The fallback algorithm is limited only to certain requests. In particular it will not rewrite if:
- request method is not `GET` or `HEAD`.
- it is a file request, e.g. `"/path/file.ext"`; note that if `PhoenixHisto`
is plugged after `Plug.Static` and we get a file request than most likely the file
does not exist and `404` response will be returned
- the client does not accept `text/html` response MIME type
- the requested path starts with one of the paths in `:blacklist`

## Installation

The package can be installed by adding `phoenix_histo` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:phoenix_histo, "~> 1.0.0"}
  ]
end
```

## Usage

Add plug invocation in your `Endpoint` pipeline just after `Plug.Static`:

```elixir
defmodule MyAppWeb.Endpoint do
  use Phoenix.Endpoint, otp_app: :my_app
  ...
  @static_opts [at: "/", from: :my_app, gzip: false]
  plug Plug.Static,
    (@static_opts ++
    [only: ~w(css fonts img js favicon.ico robots.txt manifest.json)])
  plug PhoenixHisto,
    static_opts: @static_opts,
    blacklist: ["/api"]
  ...
end
```

## Options

  - `:index` - path to index.html fallback relative to the dir passed in
`:static_opts` (defaults to `"index.html"`).
  - `:blacklist` - list of path prefixes exempt from fallback algorithm
(defaults to `[]`).
  - `:static_opts` - options to forward to `Plug.Static` (required), refer to
`Plug.Static` docs. Note that `:only` and `:only_matching`
are not respected.

## Documentation
Docs can be found at [https://hexdocs.pm/phoenix_histo](https://hexdocs.pm/phoenix_histo).

## License

PhoenixHisto source code is released under MIT License.
Check LICENSE file for more information.