9

ウェブサイトにクリーンURLを作成しようとしています。これで、apacheの構成に成功したため、mysite.com/pageなどのすべてのリクエストが機能します。ただし、mysite.com/page.phpのリクエストがmysite.com/pageにリダイレクトされることも必要です。.htaccessに環境変数を設定して、ループを防ぐために既にリダイレクトされているかどうかを確認しましたが、それでも取得できます....htaccessは次のとおりです。

<IfModule mod_rewrite.c>
Options +FollowSymlinks

RewriteEngine On
RewriteBase /

# set the variable
RewriteRule ^$ - [L]
RewriteRule ^(.*)$ $1 [E=REWROTE:0]

# this works fine
# make mysite.com/page work and set REWROTE variable to 1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L,E=REWROTE:1]

# but if i enable this, i get redirected and then stuck in a loop
# redirect mysite.com/page.php to mysite.com/page , but only if REWROTE not 1
#RewriteCond %{ENV:REWROTE} !^1$
#RewriteRule ^(.*)\.php$ $1 [R=301,L]

ありがとう!

4

4 に答える 4

14

既存の書き換えルールの上にこのルールを追加して、リクエストがすでに一度リダイレクトされている場合にリダイレクトを停止します(ref):

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
于 2009-01-31T16:18:26.067 に答える
1

最初に要求されたものについては、要求行を確認できます。

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^\ ]*)\.php[?\ ]
RewriteRule \.php$ %1 [R=301,L]

ああ、RewriteCondディレクティブの最初の引数は正規表現ではなく、単なる文字列です。したがって、エスケープするの.は間違っています。

于 2009-01-31T16:26:28.187 に答える
0

文字列終了文字 $ を使用できない理由はありますか?

RewriteRule ^/(.+)\.php$ /$1

/page.php を /page にリダイレクトしますが、 /page ではリダイレクトしません。

基本的に、環境変数の設定や REDIRECT_STATUS のチェックの追加などの手法を使用することは、あまり堅牢ではありません。

于 2009-09-28T21:51:30.540 に答える
0

私が見つけたこれらの状況でのループを防ぐもう 1 つの手っ取り早い方法は、クエリ文字列を追加し、リダイレクトでその存在を確認することです。

RewriteCond %{QUERY_STRING} !a=a
RewriteRule ^(.*)\.php$ %1 [NC,R=301,L]
RewriteRule ^(.*)$ $1.php?a=a [NC,L]

このサイトにあります: http://answers.oreilly.com/topic/542-how-to-properly-redirect-for-maximum-seo/

于 2013-02-02T02:17:55.497 に答える