1

.htaccessファイルで次のものを使用していますが、正しく機能していないようです。

Redirect 301 top_users.php http://example.com/top-users
RewriteRule ^top-users/?$ top_users.php

Redirect 301 register.php http://example.com/register
RewriteRule ^register/?$ register.php

Redirect 301 register.php?log=1 http://example.com/login
RewriteRule ^login/?$ register.php?log=1

トップユーザーページは正常に機能しているようです。/loginまたは/registerに直接アクセスすると正常に機能しますが、リダイレクトが機能しません。リダイレクトページ名の前にスラッシュを追加しようとしましたが、間違ったパスが表示され、見つからないと表示されます。

何か案は?

編集:

アップデート:

私が使用した最終的なコードは、JonLinの助けに感謝して以下のとおりでした。

RewriteEngine On
RewriteBase /
Options +FollowSymLinks

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /top-users(/|$|\ )
RewriteRule ^top-users(/|$|\ ) top_users.php [L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /top_users\.php
RewriteRule ^top_users\.php$ http://example.com/top-users/ [R=301]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register(/|$|\ )
RewriteRule ^register(/|$|\ ) register.php [L]

# check if request for register.php does not include log=1 in query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register\.php
RewriteCond %{QUERY_STRING} !log=1
RewriteRule ^register\.php$ http://example.com/register/ [R=301]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /login(/|$|\ )
RewriteRule ^login(/|$|\ ) register.php?log=1 [L,QSA]

# check if request for register.php includes log=1 in query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register\.php
RewriteRule ^register\.php$ http://example.com/login/? [R=301]
4

2 に答える 2

1

リダイレクトループが発生しています。元のリクエストがphpファイルに対するものである場合はリダイレクトし、元のリクエストが見栄えの良いURIに対するものである場合は書き換える必要があります。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /top-users(/|$|\ )
RewriteRule ^top-users top-users.php [L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /top-users\.php
RewriteRule ^top-users\.php$ http://example.com/top-users/ [R=301]

etc...

他の2つについては、クエリ文字列と照合する必要があります。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register(/|$|\ )
RewriteRule ^register register.php [L]

# check if request for register.php does not include log=1 in query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register\.php
RewriteCond %{QUERY_STRING} !log=1
RewriteRule ^register\.php$ http://example.com/register/ [R=301]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /login(/|$|\ )
RewriteRule ^login register.php?log=1 [L,QSA]

# check if request for register.php includes log=1 in query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /register\.php
RewriteCond %{QUERY_STRING} (^|&)log=1(&|$)
RewriteRule ^register\.php$ http://example.com/login/ [R=301]

Redirectまたはのクエリ文字列と照合することはできませんRewriteRule。あなたはそれを使用してそれをしなければなりませんRewriteCond %{QUERY_STRING}

于 2012-06-19T18:02:58.843 に答える
0

なぜmod_rewriteフラグを使用しないのですか?次の方法で、2行ごとに1つに編集できます。

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /
Options +FollowSymLinks

RewriteRule ^top-users(/?)$ top_users.php [L,QSA,R=301]

</IfModule>

QSAQuery String Appendの略で、任意のGETパラメータを表し、R=301各ルールの前の行を置き換えます。

于 2012-06-19T17:27:38.537 に答える