私の目標:
1. http://example.com/page/index.php -> https://example.com/page/
2. http://example.com/page/ -> https://example.com/page/
3. http://www.example.com/page/ -> https://example.com/page/
4. Any nonexistent file or directory requests -> index.php?&q=$1 for further processing.
次のルールは正常に機能しますが、クリーンなURLではなくブラウザのURLのリダイレクト後にのみ機能します。たとえば、私がリクエストした場合:
https://example.com/page/
そうですか
https://example.com/index.php?&q=page/
代わりにURLでindex.php?&q=page
を非表示にし、https://example.com/page/
を表示するにはどうすればよいですか? HTTPSリダイレクトを追加する前は、HTTPで正常に機能していました。同じ結果の2つのソリューションを試しました。
RewriteEngine on
RewriteBase /
#1 solution:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ [NC]
RewriteRule ^index\.php$ https://%{HTTP_Host}/ [L,NE,R=301]
RewriteCond %{SERVER_PORT} 80 [OR]
RewriteCond %{HTTP_Host} ^www\. [NC]
RewriteCond %{HTTP_Host} ^(?:www\.)?(.+)$ [NC]
RewriteRule (.*) https://%1%{REQUEST_URI} [L,NE,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?&q=$1 [QSA]
#2 solution:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ [NC]
RewriteRule ^index\.php$ https://%{HTTP_Host}/ [L,NE,R=301]
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule (.*) https://%1%{REQUEST_URI} [L,NE,R=301]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [L,NE,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?&q=$1 [QSA]
代わりにURLで
index.php?&q=page
を非表示にし、https://example.com/page/
を表示するにはどうすればよいですか? HTTPSリダイレクトを追加する前は、HTTPで正常に機能していました。
あなたが投稿したコードは、そのような「リダイレクト」をもたらすべきではありません。また、どちらも「HTTPSリダイレクト」を追加しても影響を受けません。
初めて... .htaccess
ファイルの最後に、internal rewriteをindex.php?&q=$1
の後に追加した場合を除きます。その場合、http://example.com/page/
、https://www.example.com/page/
、またはhttp://www.example.com/page/
のいずれかに対する要求が、そのようなexternal redirect(internalではなく) rewrite)to https://example.com/index.php?&q=page/
。ただし、https://example.com/page/
(既にHTTPSおよび非www)を要求すると、このようなリダイレクトが発生することを述べました-このシナリオでは発生しません。
以前の(誤った)リダイレクトがキャッシュされている可能性がまだあります(301はブラウザによって永続的にキャッシュされます)。これがここに表示されているものです。ただし、(コメントで)(ブラウザ?およびすべての仲介?)キャッシュがクリアされたと述べました。だから、それは「何か他のもの」(つまり、3xx HTTPステータスを設定するあなたが投稿したディレクティブの外部の何か他のもの)のままにしますか?
主な問題に直接関係しない追加のメモ:
http://example.com/page/index.php
->https://example.com/page/
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ [NC] RewriteRule ^index\.php$ https://%{HTTP_Host}/ [L,NE,R=301]
条件#1は、投稿したどのディレクティブによっても満たされていません。上に投稿したディレクティブは、ドキュメントのルートにある/index.php
のリクエストのみをリダイレクトし、あなたが述べた/page/index.php
ではなくリダイレクトします。 /page/index.php
をリダイレクトするには、要求されたURLに一致するときに/page
パスセグメントを含める必要があります(これをsubstitutionに渡します)。例えば:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /page/index\.php\ HTTP/ [NC]
RewriteRule ^(page/)index\.php$ https://%{HTTP_Host}/$1 [L,NE,R=301]
ただし、「任意のディレクトリ」ソリューションが必要になると思われます。その場合、次のようなことができます。
RewriteCond %{THE_REQUEST} /index\.php\ HTTP/ [NC]
RewriteRule (.*)index\.php$ https://%{HTTP_Host}/$1 [L,NE,R=301]
RewriteRule (.*) index.php?&q=$1 [QSA]
ファイルに後でディレクティブを追加する場合に備えて、おそらくこのディレクティブにL
(last
)フラグを含める必要があります。 (これにより、誤ってHTTPSリダイレクトを最後に追加した場合、誤ったredirectが防止されます。)
また、特定の要件がない限り、index.php?q=$1
に書き換える必要があります(&
の後に?
はありません)。例えば:
RewriteRule (.*) index.php?q=$1 [QSA,L]