1

mod_rewriteを使用して、SSLを使用するように特定のページをリダイレクトしようとしています。そのために私は持っています:

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が次のように表示される場合:

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

内部的には、次のように処理されます。

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

繰り返しますが、これは正常に機能し、私もやりたいことを実行しています。

私が今やらなければならないことは、これを元の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。

4

1 に答える 1

3

mod_rewriteのドキュメントをさらに確認すると、.htaccessファイルでの使用法に固有のことを少し見逃してしまいました。基本的に、[L]フラグは実際には標準に従って最後を示すものではありません。[END]代わりに、フラグを使用する必要があります( http://httpd.apache.org/docs/current/rewrite/flags.html#flag_l参照)。

もちろん、それは私を別の問題に導きました-私のホスティングプロバイダーはApacheまたはmod_rewriteの最新のインストールを持っていないので、[END]フラグは遍在するHTTP500内部サーバーエラーを引き起こしました。

じゃあ何をすればいいの?さて、私は期待していたことをしていないという知識を持って元のルールセットに戻り、[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]
于 2012-04-15T17:28:56.130 に答える