![.htaccess 内の絶対 URL にリダイレクトすると、OpenShift で間違ったホスト名が返される](https://rvso.com/image/658339/.htaccess%20%E5%86%85%E3%81%AE%E7%B5%B6%E5%AF%BE%20URL%20%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81OpenShift%20%E3%81%A7%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D%E3%81%8C%E8%BF%94%E3%81%95%E3%82%8C%E3%82%8B.png)
私はウェブサイトを立ち上げていますオープンシフトApache 2.2.15 で動作しますが、Apache ルートやログにアクセスできないため、サイトのルートにある .htaccess ファイルで仮想ディレクトリをエミュレートしようとしています。大部分は正常に動作していますが、リダイレクトの問題があり、原因がわかりません。
このサイトは次のように構成されています:
アプリルート/リポジトリ- .htaccess が配置されているサイトルート
アプリルート/リポジトリ/ドメイン例
アプリルート/リポジトリ/ドメイン例/メイン- メインウェブサイト(WordPress)
WordPress では、私のブログは www.example.com/blog にありますが、WordPress に移行する前は、blogs.example.com サブドメインにいくつかの記事がありました。リンクを維持するために、.htaccess にリダイレクト コマンドを設定しました。以前の共有ホスティング プロバイダーでは問題なく機能しました。OpenShift でも問題なく機能しました。前にwww.example.com を OpenShift エイリアスとして追加しました。ただし、エイリアスを追加してから、元のホスト名が blogs で始まる場合、.htaccess に www. を返すように強制できなくなりました。
アパッチ族からリダイレクトドキュメント:
新しい URL は、スキームとホスト名で始まる絶対 URL である必要があります。Apache HTTP Server 2.2.6 以降では、スラッシュで始まる URL パスも使用できます。その場合、現在のサーバーのスキームとホスト名が追加されます。その後、URL パスで始まるすべてのリクエストは、ターゲット URL の場所でクライアントにリダイレクト リクエストを返します。
私が期待していること:ターゲットとして絶対 URL を指定した場合、リダイレクトはその URL をクライアントに返す必要があります。その後、クライアントは正しい URL を使用してリクエストを再発行できます。
何が起こっている:リダイレクトは発生しています (Firebug で 302 が表示されます) が、ターゲットではなくソース ドメインを指しています。絶対 URL を指定しているにもかかわらず、2 番目のビット (「現在のサーバーのスキームとホスト名を使用」) を実行しているようです。
以下は私の .htaccess の抜粋です:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# This section from https://my.bluehost.com/cgi/help/347#redirect
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteCond %{REQUEST_URI} !^/domain_example/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /domain_example/main/$1
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteRule ^(/)?$ domain_example/main/index.php [L]
# blogs.example.com redirects
redirect 302 /mark/post/Check-Windows-Time-Settings.aspx http://www.example.com/blog/2010/05/check-windows-time-settings/
この.htaccessを使用すると、http://blogs.example.com//mark/post/Check-Windows-Time-Settings.aspxFirebugでレスポンスを確認すると、302リダイレクトが行われていることがわかりますhttp://blogs.example.com/blog/2010/05/check-windows-time-settings/しかし、それは存在しないので、404 Not Found が表示されます。www に移動するように指示したのに、なぜブログに移動してしまうのでしょうか?
OpenShift エイリアスが何らかの形でリダイレクトを上書きしているのではないかと考えましたが、リダイレクトのドキュメントによると次のようになります。
リダイレクト ディレクティブは、構成ファイル内の順序に関係なく、Alias ディレクティブおよび ScriptAlias ディレクティブよりも優先されます。
また、明示的なトラップを追加して、blogs.example.com/blog/ で始まるパス (リダイレクトによって返されるものと思われる) を書き換えることも試しました。
RewriteCond %{HTTP_HOST} ^blogs\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
それでも404 Not Foundが表示されます。実際、最も基本的なURLでもhttp://blogs.example.com/blog/、404 を返します。
このような状況でリダイレクトを機能させるにはどうすればよいですか?
2015年5月27日更新 #1
Rewrite ブロックで「not」ロジックを使用してみました:
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
これにより、リダイレクトの無限ループが発生し、20回のリダイレクトで終了します。各リダイレクトは次のように始まります。http://blogs.example.comそのため、RewriteRule が URL の先頭に「www」を書き込むのを妨げる何かがまだあります。
NOT ロジックを次のように終了した場合も同じ結果になります$
。
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
2015年5月27日更新 #2
@Quasidynamic は、%(HTTP_HOST) にはホスト名のみが含まれ、それ以降は何も含まれないことを指摘しました。そこで、次のようにして、で始まる URL のみを選択してみましたwww.example.com/blog
:
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} ^/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
無限ループはありませんが、Redirect は に移動しblogs.
、その後 Rewrite は への送信に失敗しますwww.
。
2015年5月28日更新
@Quasidynamic のリクエストに従って、次のブロックを試します:
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
予想どおり、 を参照するとblogs.example.com
、 にリダイレクトされますblogs.example.com/blog/
。これは RewriteCond とまだ一致するため、 にリダイレクトされますblogs.example.com/blog/blog/
。これが無限に続きます。 には決して移動しません。www.example.com
これが最初から抱えていた根本的な問題です。 をblogs.example.com
OpenShift サブドメインとして追加すると、何を試しても .htaccess を使用して にリダイレクトできなくなりますwww.example.com
。
答え1
[old] が blogs.example.com で、[target] が www.example.com/blog の場合:
RewriteCond %{HTTP_HOST} blogs.example.com$ RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=301,L]
近かったのですが、リクエストで /blog を一致させようとしていましたが、これは [ターゲット] サイトにのみ存在し、状況を理解しています。
コード 301 を使用します - 「ステータス 301 は、リソース (ページ) が新しい場所に恒久的に移動されたことを意味します。クライアント/ブラウザは元の場所を要求せず、今後は新しい場所を使用する必要があります。」
https://stackoverflow.com/questions/1393280/http-redirect-301-permanent-vs-302-temporary