Apache – Using Custom Variables in If-Else Statements in Apache Config

apache-2.4httpd.conf

Here's my code (I've commented out the if-else part as it's not working)

snippets/contents of my config files

/etc/httpd/conf.d/staff.vhost

Define host_domain "staff"

Include /etc/httpd/conf.d/stage_template.vhost

/etc/httpd/conf.d/stage_template.vhost

    #<If "${host_domain} == 'main'">
    #    ServerAlias stage.myhost.com
    #</If>
    #<Else>
        ServerAlias stage-${host_domain}.myhost.com
    #</Else>

${host_domain} can have 3 possible values: main or staff or customer

I have tried these comparisons

  • "${host_domain} == 'main'"

    AH00526: Syntax error on line 9 of /etc/httpd/conf.d/stage_template.vhost: Cannot parse condition clause: syntax error, unexpected T_OP_STR_EQ, expecting '('

  • "%{host_domain} == 'main'"

    AH00526: Syntax error on line 9 of /etc/httpd/conf.d/stage_template.vhost:
    Cannot parse condition clause: Parse error near '%'

  • "'${host_domain}' == 'main'"

    AH00526: Syntax error on line 10 of /etc/httpd/conf.d/available_vhosts/stage_template.vhost:
    ServerAlias not allowed here

I was using this page as guide. But it's doesn't have any examples when using custom variables.

Thanks!

Best Answer

Apache's If-Else statements are evaluated at request time, while Virtual Host Matching has its own logic. That's why it's likely that If-Else wouldn't work with ServerAlias at all, or it would give unexpected results. On the other hand, you state that your "${host_domain} can have 3 possible values". What you are trying to do is overly complicated, and you have several better approaches.

  • Use separate <VirtualHost> for each main, staff and customer.
  • Add all these virtualhost to a single <VirtualHost> with every option matching a single ServerAlias. Then, you can use If-Else statements inside the <VirtualHost> to alter specific configuration based on the %{HTTP_HOST} variable.
  • If there was several similar <VirtualHost>s (way more than just three) with just a certain changing parts in the configuration, Apache Module mod_macro would have been your choice. As the macros are evaluated when the server starts, building a static configuration out of them, it's more efficient than comparing the variables at request time.
Related Topic