2012-04-14 14 views
1

mod_rewriteを使用して特定のページをリダイレクトしてSSLを使用しようとしています。そのために私は持っています:外部リダイレクトと内部書き換えを使用したmod_rewrite

RewriteCond %{SERVER_PORT} ^443$ 
RewriteCond %{REQUEST_URI} !^/login(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/contact-us(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/\..*$ 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC] 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteCond %{REQUEST_URI} ^/login(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/contact-us(\.php)?$ [NC] 
RewriteRule ^(.+)\.php$ https://www.example.com/$1 [R=301,L] 

これはうまく動作し、私はそれが欲しいものを正確に行います。

その後、私の.htacessで私が持っている:

RewriteRule ^members/(.+)/change-password$ members/.change-password.php?item=$1 [NC,QSA,L] 

ので、URLは、たとえば、として表示される場合:

/members/.change-password.php?item=foo-bar 

http://www.example.com/members/foo-bar/change-password 

内部的には、として処理されます

もう一度、これはうまく動作し、私もそれが欲しいものをやっている。

私が今必要とするのは、元のSSLリダイレクトロジックにこれを含めて、変更パスワードリクエストが同じURLにリダイレクトされ、代わりにhttpsでリダイレクトされるようにすることです。私は試しました:

RewriteCond %{SERVER_PORT} ^443$ 
RewriteCond %{REQUEST_URI} !^/login(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/contact-us(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/\..*$ 
RewriteCond %{REQUEST_URI} !^/members/.+/change-password [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC] 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteCond %{REQUEST_URI} ^/login(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/contact-us(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/members/.+/change-password [NC] 
RewriteRule ^(.+)\.php$ https://www.example.com/$1 [R=301,L] 

しかし、これは動作しません - 私はちょうどhttpで配信されるページを取得します。 .+.*に変更すると、私を永続的なリダイレクトループに入れることができます。

私はこれが内部書き換えのためだと思っていますが、何を試しても解決できないようです。

誰でも助言できますか?

おかげで、

アダムM.

+0

自動リダイレクションに依存しないで、それらのセクションへのリンクが 'https://'を使用していることを確認してください。 (詳細については、[この回答](http://webmasters.stackexchange.com/a/28443/11628)と[この回答](http://stackoverflow.com/a/9105894/372643)を参照してください。) – Bruno

+0

@Brunoレスポンスありがとうございますが、フロントエンドのリンクはhttpsに直接指定されています。自動リダイレクトの理由は、URL自体にタイプするもののためのベルトとカッコです。私が探しているユーザーエクスペリエンスを提供しないURLのhttps要求は、[F] 'できませんでしたが(誰もこのアプローチに同意しないと確信しています)。 –

+0

アプリケーションを開発するときにこれらのリダイレクトが存在すると仮定していない限り、あなたのアプローチは確かに意味があります。 – Bruno

答えて

3

のmod_rewriteのドキュメントの更なる見直しは、私は.htaccessファイルでの使用方法に固有逃したと思いますビットに私を導きました。基本的には、[L]フラグは実際にはノルムのように最後には表示されません。代わりに、[END]フラグ(http://httpd.apache.org/docs/current/rewrite/flags.html#flag_lを参照)を使用する必要があります。

もちろん、私のホスティングプロバイダにはApacheまたはmod_rewriteの最新のインストールがないため、[END]フラグがubiqitous HTTP 500 Internal Server Errorを引き起こしました。

だから何をすればいいですか?さて私は[L]は私が期待していた何をやってすぐにエラーを発見されなかったことを知って戻って私の元のルールセットへ行ってきました - %{REQUEST_URI}値は、内部の書き換えによって更新されていた:

RewriteRule ^members/(.+)/change-password$ members/.change-password.php?url-slug=$1 [NC,QSA,L] 

は、そのため私の元を変更しますこれを除外するリダイレクトロジックは私の問題を解決:

RewriteCond %{SERVER_PORT} ^443$ 
RewriteCond %{REQUEST_URI} !^/login(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/contact-us(\.php)?$ [NC] 
RewriteCond %{REQUEST_URI} !^/\..*$ 
RewriteCond %{REQUEST_URI} !^/members/.+/change-password$ [NC] 

RewriteCond %{REQUEST_URI} !^/members/\.change-password(\.php)? [NC]

RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC] 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteCond %{REQUEST_URI} ^/login(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/contact-us(\.php)?$ [NC,OR] 
RewriteCond %{REQUEST_URI} ^/members/.+/change-password$ [NC] 
RewriteRule ^(.+)(\.php)?$ https://www.example.com/$1 [R=301,L] 
関連する問題