2012-01-01 20 views
3

私はname.phpファイルを/ name/ にリダイレクト/リライトしたいと思っていました。別のトピックの解決策を見つけました(http://stackoverflow.com/questions/5527789/htaccess)。 -rewrite-within-directory-hide-php-extension-and-force-trailing-slash)/file.php to/file /試してください

私は自分でそれを学びたいと思っていました。 Iが最初に例えば.COM /試験/ .COM/test.phpをのコンテンツを表示させるれ、これを使用する:

RewriteEngine On 
RewriteRule ^(.*)/$ $1.php 

そしてIは.COM/test.phpをリダイレクトれ、それ自体で、次のことを試みました.com/test /:

RewriteEngine On 
RewriteRule ^(.*)\.php$ http://www.mydomain.info/$1/ [R=301] 

したがって、どちらも単独で動作します。しかし、それらを組み合わせると、[L]を追加してもループエラーが発生します。これはルールを一度しか使用しないことを意味します。だから、これは動作しません。

RewriteEngine On 
RewriteRule ^(.*)/$ $1.php [L] 
RewriteRule ^(.*)\.php$ http://www.mydomain.info/$1/ [L,R=301] 

私はおそらくいくつかの愚かなエラーを作ったが、それは私には論理的に思える... ホープ誰かが私の誤りを指摘することができます。おかげさまで

+0

更新された回答をご覧ください。 – ziesemer

答えて

1

R=301の外部リダイレクトがあるため、Lを追加すると、リダイレクトが新しいリクエストとしてサーバーに戻ってくるため、最初のリライトに再び一致しますルール。

代わりに、あなたはこのようなものが必要です。THE_REQUESTは、例えば、元の要求の全体のラインと一致していることを

RewriteCond %{THE_REQUEST} ^\w+\ /(.*)\.php\ HTTP/ 
RewriteRule^/%1/ [R=301] 

RewriteRule ^(.*)/$ $1.php 

注意をGET /index.php HTTP/1.1%{REQUEST_URI}が第2のルールの一部として.phpに書き換えられても(内部サブリクエストで一致する場合)、%{THE_REQUEST}は書き換えられません。これにより、.phpに書き換えられたURLがサブリクエストで一致しないことが保証されます別のリダイレクトがクライアントに返されます。

1

最初のルールからLフラグを削除します。それは "実行中"を停止し、2番目のルールは使用されません。 2番目のルールでは、最後のルールなのでLフラグを保持する必要があります。

+0

これをテストしたところ、うまくいかないようです。 – ziesemer

+0

これはうまくいきましたが、私はそれがあってもなくても同じ結果が得られます。 – Steven

+0

しかし、あなたはまた、R = 301を出したのですか? – Dion

関連する問題