Redirect single/multiple domain(s) to your Discourse instance


(Arpit Jalan) #1

So you want to redirect domain(s) to your Discourse instance? Great, let’s get started!

In this tutorial we’ll show how to redirect www.example.com and example.com to talk.example.com.

Update DNS Record

Update the A record for the domain(s) you want to redirect to original domain.

Edit Configuration FIle

Open configuration file app.yml. From console, run these commands:

cd /var/discourse
git pull
nano containers/app.yml

Configuration file will open in nano editor. Search for hooks (with Ctrl+W) in the file:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git

Add after_web_config block to the hooks (proper indentation is important):

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
  after_web_config:
    - replace:
        filename: /etc/nginx/nginx.conf
        from: /sendfile.+on;/
        to: |
          server_names_hash_bucket_size 64;
          sendfile on;
    - file:
        path: /etc/nginx/conf.d/discourse_redirect_1.conf
        contents: |
          server {
            listen 80;
            server_name example.com;
            return 301 $scheme://talk.example.com$request_uri;
          }
    - file:
        path: /etc/nginx/conf.d/discourse_redirect_2.conf
        contents: |
          server {
            listen 80;
            server_name www.example.com;
            return 301 $scheme://talk.example.com$request_uri;
          }

You can add as many file blocks as you want, depending on number of domain(s) you want to redirect:

    - file:
        path: /etc/nginx/conf.d/discourse_redirect_3.conf
        contents: |
          server {
            listen 80;
            server_name discourse.example.com;
            return 301 $scheme://talk.example.com$request_uri;
          }

Modify the file name discourse_redirect_3 and domain name to which you want to redirect discourse.example.com as per your need.

Note that original domain name talk.example.com will remain same in all file blocks.

After completing your edits, press Ctrl+O then Enter to save and Ctrl+X to exit.

Rebuild Container

Run this command:

./launcher rebuild app

Congratulations, that’s it! Try visiting example.com and www.example.com, they both will redirect to talk.example.com!


Can we configure www -> non-www redirect in admin panel?
How do I redirect www to non-www?
Redirect non www to www version on digitalocean?
301 redirect to my old forum archive
Change the domain name or rename my Discourse?
Installing wp in sub folder (https-docker-setup)
Setting up Let’s Encrypt with Multiple Domains
How do I redirect www to non-www?
Internal topic link behavior on non-http installs
(Salman, Freelance Developer) #5

Just a tip it is also a good idea to redirect commonly guessed urls to your main discourse install

e.g.  forum{s}.example.com => talk.example.com

(flexihack) #6

What do I change

to? Where can I find the name?


(Arpit Jalan) #7

You can name the .conf file as you desire, but for easy understanding and consistent format, I named them as discourse_redirect_1.conf, discourse_redirect_2.conf, etc.

[NOTE: The number of .conf files required will depend on the number of domains you want to redirect. If you want to redirect a single domain (e.g www.domain.com to domain.com) then you will require a single .conf file, which you can also name as discourse_redirect.conf.]


(Kane York) #11

It is not recommended to put Discourse on the root domain, because cookies set on the root domain carry over to all others, and you might end up with max-length cookie errors if you ever want anything else there.


Redirect www Domain Not Working
(Tomo Vukasović) #12

Why would I want anything else? :smile:

I understand. That is exactly my problem. I can log out at non-www and stay logged in www.

CNAME www mysite.com.

I don’t remember this being explicit requirement during the discourse installation. Anyhow, it should work with the setup above.


(Tomo Vukasović) #13

I pretty much tried everything. Even consulted Digital Ocean guys. It seems if Discourse is installed in root there is no option to redirect www domain to non-www?


#14

I followed the guide, and did rebuild.

I wanted to my www.example.com redirect to example.com

After the rebuild, I visited www.example.com

and I am seeing this.

What can I do now?


#15

I tried with DigitalOcean Droplet, then redirection worked fine. (No further configuration required)

The problem above was not using DigitalOcean Droplet.

I am searching what further configuration is required… :frowning:

If anyone tell me anything… it will be much appreciated.


(Marcin Rataj) #16

Hm… if example.com works fine, and the only problem you have is default page (Welcome to Nginx on Debian!) showing at www.example.com you just need to add this short server definition at the beginning of your vhost config file (probably something in /etc/nginx/sites-enabled/*):

server {
    listen 80;
    server_name www.example.com;
    return 301 http://example.com$request_uri
}

It will add permanent (301) HTTP redirect from www.example.com to example.com.
Remember to reload nginx afterwards.


#17

I edited /etc/nginx/sites-enabled/default

with:

server {
    listen 80;
    server_name www.example.com;
    return 301 http://example.com$request_uri;
}

And did:

root@ubuntu:/etc/nginx# sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@ubuntu:/etc/nginx# sudo service nginx reload
 * Reloading nginx configuration nginx                   [ OK ]

However I am still watching “Welcome to nginx” message :sweat_smile:


(Marcin Rataj) #18

In that case I need to take a look at everything in /etc/nginx/sites-enabled/* to give you a meaningful answer.
If you are okay with it, PM me with configuration files.


(Tomo Vukasović) #19

You can set A record for www

Not the best solution because then you end up with duplicate sites that do not share cookies. That was my fix until I fixed nginx problem.

With your setup everything should work. I have added etc/nginx/sites-enabled/default because it was missing. I redirected opposite from non-www to www.

    listen 80;
    server_name example.com;
    return 301 http://www.example.com$request_uri;

With all this beauty still no redirection until I found error: server_names_hash_bucket_size: 32

So I went to nginx.conf and increased the default bucket size from 32 to 64. Now everything works.


#20

I have been already using 2 A records for WWW and Non-WWW to same IP Address.

I had duplicate sites as you said.

But this “Welcome to Nginx” message problem started after I did this How-to Guide.

So I have lost my one dupilcate site as I said above, but the other one is working.

ps. I think I have no error in app.yml, but I will check one more time.


#21

Now… it is time to confess.

After 3 days of agony, I finally solved the problem.

I missed ;

I thought I was so sure about app.yml file… because I checked it again and again. (and didn’t realize that every time)

Anyway… I just found it.

Now everything is working well… :cry:

I am sorry to make you guys confused… this How-to guide is perfect.


(Tomo Vukasović) #22

Use http://www.yamllint.com/ to validate your yml files.


(Jeff Atwood) #23

It was valid YAML. It was missing a ; in the command. We already validate YAML as part of the bootstrap.


(Tomo Vukasović) #24

Interestingly I remember missing ; in my translation files and yamlint helped.


(Serge Vodwood) #25

Sorry, but after doing this should I point only my domain.com to droplet IP with an A record in order for this to work? Or should I make 3 A records (all pointing to the same IP) for talk.domain.com, domain.com and www.domain.com? Or perhaps 2 A records and 1 CNAME (for www to non-www redirect)?


#26

All A records(www/talk/non-www) to the same IP. Then do above configuration in your app.yml. And this will let you redirect. That’s how I did! I didn’t do anything about Cname.