2

利他的な uber htaccess ウィザード紳士への挑戦:

私が取り組んでいる新しいサイトの htaccess ファイルを削っていますが、クラックできません。各セグメントは独立して動作していますが、すべてを一緒に動作させることはできません。PHP REQUEST_URI に基づいてサイトを生成しています。複数のドメインが同じディレクトリを指しているため、複数のドメインに対して機能する必要があります。私は達成しようとしています:

  1. 同じディレクトリを指す複数のドメイン、
  2. 強制的に非 www、
  3. 拡張子なしで末尾のスラッシュを強制し、
  4. 存在しないものをすべて特定のスクリプトにリダイレクトする

基本的に:

http://www.example.com/dog/cat -> 301 は -> http://example.com/dog/cat/のように表示されます-> しかし、静かに -> http://example.com/script にリダイレクトされます。 php

また

http://www.example.com/dog/cat/pig/bird/walrus -> 301 は次のように表示されます -> http://example.com/dog/cat/pig/bird/walrus/ -> 静かにリダイレクトします - > http://example.com/script.php

また

http://www.example.com/dog/cat.html -> 301 は次のように表示されます -> http://example.com/dog/cat/ -> サイレントにリダイレクトします -> http://example.com/script .php

また

http://www.example.com/dog.php -> 301 は次のように表示されます -> http://example.com/dog/ -> サイレントにhttp://example.com/script.phpにリダイレクトします

これまでのところ、次のスニペットを使用してきました(記憶から許してください):

非 www:

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

末尾のスラッシュを取り除きます:

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [L,R=301]

スクリプトにはすべて存在しません:

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^.*/$ ./script.php [L]

特定の部分がまったく機能しない、再帰的な影響などの問題がありました。助けを求めるのは好きではなく、宿題をするために最善を尽くしましたが、これを理解できません。

ここで、次のような同様の質問を見つけました。

htaccess は末尾にスラッシュを追加し、クリーンな URL で www を強制します

どんな助けでも大歓迎です!

アップデート:

そのため、.htaccess ファイルをいじり続けました。質問の下にコメントを追加して、Firefox の「素晴らしい」アドレスバー検索機能で、ドメインが www や末尾のスラッシュがない場合にドメイン名をリダイレクトして検索することに問題があったことを伝えました。このため、スキームを一貫性のあるものに変更しましたが (重複を防ぎます)、反対のことを行いました: www と末尾のスラッシュを強制します。

次のコードは、探しているものに近い結果を生成します。

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

#Redirect Forcing trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .*[^/]$ /$0/ [L,R=301]

#Redirect non-www to www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

#Redirect to script
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ script.php [L]

存在しないファイルから拡張子を削除する必要があります。つまり、次のようになります。

www.example.com/cats.html -> www.example.com/cats/

どんなアドバイスも世界を意味するでしょう...

4

1 に答える 1

1

ストリップ末尾のスラッシュ ルールに問題があります。

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [L,R=301]

同じ末尾のスラッシュを再度照合し、リダイレクトに別のスラッシュを追加しています。ターゲットを次のように変更する必要があります。

RewriteRule ^(.*)/$ http://%{HTTP_HOST}/$1 [L,R=301]

これにより、間違いなくリダイレ​​クト ループが発生します。それ以外の場合、問題であった可能性のある他の唯一の問題は、の%{SCRIPT_FILENAME}代わりに使用することです%{REQUEST_FILENAME}。ほとんどの場合、違いはありませんが、おそらく 2 番目のものは本当に必要なものです。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*/$ ./script.php [L]

2 つのリダイレクト ルールがルールへのルーティングの前にある限り、これらのルールが互いに競合することはありませんscript.php。バニラ Apache インストールの空の htaccess ファイルで正常に動作しています。

于 2012-10-22T08:55:24.933 に答える