Есть ли способ использовать If..Then..Else в .htaccess на Apache 2.2.29 в среде общего хостинга?

Я узнал из этого вопроса и ответа: Как написать if.. .else операторы mod_rewrite в .htaccess, что можно реализовать оператор If в .htaccess, но на Apache 2.4 и выше.

Из этого вопроса и ответа я узнал: оператор htaccess if, как реализовать оператор If для версий Apache менее 2.4. Ответ @julp почти решает мою проблему, но я не думаю, что мне разрешено делать «добавления» на виртуальном хостинге.

Есть ли обходной путь для использования If..Then..Else в .htaccess на Apache 2.2.29 в среде общего хостинга?

Обновление:

По указанию @Thakkie я добавляю свои особые требования.

Я пытаюсь разместить два домена с одной учетной записи общего хостинга. Мой файл .htaccess выглядит следующим образом:

<If “%{HTTP_HOST} == ‘domain2.com’”>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ domain2.com-directory/domain2-index.php [QSA,L]
</IfModule>

</If>

<Else>

RequestHeader set X-Prerender-Token "<MyToken>"

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTP_HOST} ^www.domain1.com/domain1-index.php$ [NC]
RewriteRule ^(.*)$ https://www.domain1.com/domain1-index.php$1 [R=301,L]

<IfModule mod_proxy_http.c>
RewriteCond %{HTTP_USER_AGENT} baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator [NC,OR]
RewriteCond %{QUERY_STRING} _escaped_fragment_

# Only proxy the request to Prerender if its a request for HTML
RewriteRule ^(?!.*?(\.js|\.css|\.xml|\.less|\.png|\.jpg|\.jpeg|\.gif|\.pdf|\.doc|\.txt|\.ico|\.rss|\.zip|\.mp3|\.rar|\.exe|\.wmv|\.doc|\.avi|\.ppt|\.mpg|\.mpeg|\.tif|\.wav|\.mov|\.psd|\.ai|\.xls|\.mp4|\.m4a|\.swf|\.dat|\.dmg|\.iso|\.flv|\.m4v|\.torrent|\.ttf|\.woff))(.*) http://service.prerender.io/https://%{HTTP_HOST}/$2 [P,L]
</IfModule>

# Transfers to www.domain1.com when domain1.com is entered
RewriteCond %{HTTP_HOST} ^domain1.com$ [NC]
RewriteRule ^(.*)$ https://www.domain1.com/$1 [L,R=301]

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ domain1.com-directory/domain1-index.php [QSA,L]

</Else>

Я назначаю один набор операций для domain1.com и другой набор операций для domain2.com в зависимости от HTTP_HOST с использованием <If><Else>.

Я попробовал указанный выше файл .htaccess на выделенном сервере моего друга, на котором работает Apache 2.4, и это сработало.

Но, к сожалению, мой провайдер учетной записи общего хостинга использует Apache 2.2.29, поэтому <If></If> и <Else></Else> не поддерживаются.

Каков обходной путь для <If><Else> в моей ситуации?


person Raja    schedule 24.04.2017    source источник
comment
Директивы IF ELSE недоступны в версии 2.2. Вам нужен apache 2.4+, чтобы использовать их.   -  person Amit Verma    schedule 24.04.2017
comment
@starkeen Да, я понимаю. Но есть ли обходной путь?   -  person Raja    schedule 24.04.2017
comment
Вам нужно будет опубликовать точное и полное описание и пример, потому что любой обходной путь будет соответствовать вашим потребностям.   -  person Thakkie    schedule 24.04.2017
comment
@Takkie Описание добавлено...   -  person Raja    schedule 25.04.2017


Ответы (1)


Это может быть не самое идеальное решение, но оно сработало для меня.

На самом деле я использовал оператор <If><Else> для выполнения действий, специфичных для домена.

Поскольку оператор <If> не разрешен в Apache 2.2.29, я добавил RewriteCond %{HTTP_HOST} ^domainname.com$ [NC] перед каждым RewriteRule, который я хотел указать в домене.

Таким образом

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ domain2.com-folder/domain2-index.php [QSA,L]

становится

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^www.domain2.com$ [NC]
RewriteRule ^ domain2.com-folder/domain2-index.php [QSA,L]

Приведенные выше строки означают: ЕСЛИ (запрошенное имя файла не существует) И (HTTP_HOST равно www.domain2.com), ТО используйте RewriteRule.

По сути, я использовал RewriteCond для выполнения функции оператора <If>, который можно использовать в Apache 2.4 или выше.

Теперь весь файл .htaccess:

RequestHeader set X-Prerender-Token "<MyToken>"

RewriteEngine On

RewriteCond %{HTTP_HOST} ^domain2.com$ [NC]
RewriteRule ^(.*)$ http://www.domain2.com [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^www.domain2.com$ [NC]
RewriteRule ^ domain2.com-folder/domain2-index.php [QSA,L]

# Since I want the HTTPS to be domain specific
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(domain1.com|www.domain1.com)$ [NC]
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTP_HOST} ^www.domain1.com/domain1-index.php$ [NC]
RewriteRule ^(.*)$ https://www.domain1.com/domain1-index.php$1 [R=301,L]

<IfModule mod_proxy_http.c>
RewriteCond %{HTTP_USER_AGENT} baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator [NC,OR]
RewriteCond %{QUERY_STRING} _escaped_fragment_

# Only proxy the request to Prerender if its a request for HTML
RewriteRule ^(?!.*?(\.js|\.css|\.xml|\.less|\.png|\.jpg|\.jpeg|\.gif|\.pdf|\.doc|\.txt|\.ico|\.rss|\.zip|\.mp3|\.rar|\.exe|\.wmv|\.doc|\.avi|\.ppt|\.mpg|\.mpeg|\.tif|\.wav|\.mov|\.psd|\.ai|\.xls|\.mp4|\.m4a|\.swf|\.dat|\.dmg|\.iso|\.flv|\.m4v|\.torrent|\.ttf|\.woff))(.*) http://service.prerender.io/https://%{HTTP_HOST}/$2 [P,L]
</IfModule>

# Transfers to www.domain1.com when domain1.com is entered
RewriteCond %{HTTP_HOST} ^domain1.com$ [NC]
RewriteRule ^(.*)$ https://www.domain1.com/$1 [L,R=301]

# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^www.domain1.com$ [NC]
RewriteRule ^ domain1.com-folder/domain1-index.php [QSA,L]

P.S. Я прошу старших исправить мое описание, если вы считаете его неточным.

person Raja    schedule 25.04.2017