augnustin
Making robots.txt environment specific
Hello,
I would like to have robots.txt empty in production, but in my staging environment that it contains:
User-agent: *
Disallow: /
Is there a way to simply achieve this?
Thanks
Marked As Solved
kokolegorille
robots.txt is a static file pushed to web root by copy-webpack-plugin.
I think your solution is to check env in webpack, and change copy-webpack-plugin config to depend on it.
Also Liked
Phillipp
sheerlox
Reviving this thread with a solution on how to achieve this behavior with a Plug, since I haven’t been able to find an answer here or on the Fly.io forums:
lib/my_app_web/plugs/robots.ex
defmodule MyAppWeb.Plugs.Robots do
@behaviour Plug
import Plug.Conn
@impl true
def init(opts), do: opts
def call(%Plug.Conn{request_path: "/robots.txt"} = conn, _opts) do
deploy_env = Application.get_env(:unill, :deploy_env)
file = Application.app_dir(:unill, "priv/static/robots-#{deploy_env}.txt")
content = File.read!(file)
conn
|> send_resp(200, content)
|> halt()
end
@impl true
def call(conn, _opts), do: conn
end
lib/my_app_web/endpoint.ex
defmodule MyAppWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :my_app
plug MyAppWeb.Plugs.Robots
config/runtime.exs
deploy_env =
case System.get_env("PHX_HOST") do
"myapp.com" -> :production
"staging.myapp.com" -> :staging
_ -> :dev
end
config :my_app, :deploy_env, deploy_env
Then, create the relevant robots-staging.txt and robots-production.txt files in priv/static/.
Remember to remove the robots.txt from the static_paths in lib/my_app_web.ex, although this plug should load and return a response before it if you’ve added it before the Plug.Static configuration.
cnck1387
Another option could be to have your configuration management tool write your robots.txt file. That’s what I do in Ansible. Then I just write a different robots.txt depending on which server / environment I’m deploying to and the code for it is alongside my other environment specific settings.
Last Post!
sheerlox
Reviving this thread with a solution on how to achieve this behavior with a Plug, since I haven’t been able to find an answer here or on the Fly.io forums:
lib/my_app_web/plugs/robots.ex
defmodule MyAppWeb.Plugs.Robots do
@behaviour Plug
import Plug.Conn
@impl true
def init(opts), do: opts
def call(%Plug.Conn{request_path: "/robots.txt"} = conn, _opts) do
deploy_env = Application.get_env(:unill, :deploy_env)
file = Application.app_dir(:unill, "priv/static/robots-#{deploy_env}.txt")
content = File.read!(file)
conn
|> send_resp(200, content)
|> halt()
end
@impl true
def call(conn, _opts), do: conn
end
lib/my_app_web/endpoint.ex
defmodule MyAppWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :my_app
plug MyAppWeb.Plugs.Robots
config/runtime.exs
deploy_env =
case System.get_env("PHX_HOST") do
"myapp.com" -> :production
"staging.myapp.com" -> :staging
_ -> :dev
end
config :my_app, :deploy_env, deploy_env
Then, create the relevant robots-staging.txt and robots-production.txt files in priv/static/.
Remember to remove the robots.txt from the static_paths in lib/my_app_web.ex, although this plug should load and return a response before it if you’ve added it before the Plug.Static configuration.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









