2017-04-24 5 views
1

私はこのQ & A:How to write "if...else" mod_rewrite statements in .htaccessから、Ifステートメントを.htaccessでは実装できますが、Apache 2.4以上であることを知りました。共有ホスティング環境のApache 2.2.29の.htaccessにIf..Then..Elseを使用する方法はありますか?

私はこのQから学んだ& A:htaccess if statement、どのようにipmlement Ifステートメントは2.4未満のバージョンのApache用です。 @julpの答えは私の問題をほぼ解決しますが、私はShared Hostingで「追加すること」をすることは許されていないと思います。

環境ホスティング共有のApache 2.2.29上の.htaccessにIf..Then..Elseを使用する任意の回避策はありますか?

更新:

@Thakkieによって指示されたように、私は私の特定の要件を追加しています。

1つの共有ホスティングアカウントから2つのドメインをホストしようとしています。次のように私の.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と<If><Else>を使用してHTTP_HOSTに応じて、domain2.comするための動作の別のセットのための動作の一セットを割り当てています。

Apache 2.4を実行している私の友人の専用サーバーで上記の.htaccessファイルを試してみました。

残念ながら、私の共有ホスティングアカウントプロバイダはApache 2.2.29を実行しているため、<If></If><Else></Else>はサポートされていません。

私の状況では<If><Else>の回避策は何ですか?

+0

2.2では、ELSEディレクティブは使用できません。それらを使うにはapache 2.4+が必要です。 – starkeen

+0

@starkeenはい、わかりました。しかし、回避策はありますか? – Raja

+0

正確かつ完全な説明と例を掲載する必要があります。回避策は、ニーズに応じて決まるためです。 – Thakkie

答えて

1

これは最も完璧な解決策ではないかもしれませんが、それは私のために働いています。

ドメイン特有の操作を実行するために実際に<If><Else>ステートメントを使用していました。

<If>文がApacheの2.2.29で許可されていないとして、私は、私は、ドメインの特定になりたかったすべてのRewriteRuleRewriteCond %{HTTP_HOST} ^domainname.com$ [NC]を追加。 IF(要求されたファイル名が存在しない)と(HTTP_HOSTwww.domain2.comある)THEN 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] 

なります。

本来、を使用して、Apache 2.4以降で使用可能な<If>演算子の機能を実行しました。

さて、全体の.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.あなたがそれが間違っていると感じたら、先輩に私の説明を訂正してもらいたい。

関連する問題