0

ファイルにRewriteRuleをたくさん書いていますが、 httpsからhttpページ.htaccessに切り替えると問題が発生します。それはこれらの規則に従わない

注: localhostですべて正常に動作し、問題はサーバーにあります<---- UPDATE

これが私のウェブサイトです。現在、すべてのリンクはRewriteRule*に従って表示されます。

たとえば、私たちについてのページのリンク表示として

http://www.mywebsite.com/about

しかし

私がlogin page(オンになっている)にいて、私たちについてhttpsのページをクリックすると、下に変わります。

http://www.mywebsite.com/about?slug=about_us

または、左パネルのカテゴリをクリックすると、次のようになります

http://www.mywebsite.com/auction/category/1?cid=1

注: ページ上にマウスを置いても、書き換えリンクが表示されます

以下は.htaccess、必要な情報を含むファイルです。

IndexIgnore *

RewriteEngine on
Options +FollowSymLinks 
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^auction/category/([0-9]+)/?$ bids.php?cid=$1 [NC]

RewriteRule ^login/?$ login.php [NC]
RewriteRule ^register/?$ register.php [NC]
RewriteRule ^logout/?$ logout.php [NC]

# static pages
RewriteRule ^about/?$ page.php?slug=about_us [NC]

# Rewrite to https
RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} /login [OR]
RewriteCond %{REQUEST_URI} /do_login.php     
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L,QSA]

# don't do anything for images/css/js (leave protocol as is)
RewriteRule \.(gif|jpe?g|png|ico|css|js)$ - [NC,L]

# traffic to http:// except some pages
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !(/login|/do_login.php)
RewriteRule ^(.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,NC,L,QSA]

注: Here完全な.htaccessファイルです

どこが間違っているか教えてください。

私ももう少し混乱しています

  • URL の書き換え ( Login または login または login ) の大文字と小文字を変更すると、エラーが発生しますか?
  • すべてを[NC,L]と書くのは良い習慣RewriteRuleですか?
  • いつ[QSA]と書くべき ですか?

アップデート

すべての回答からの提案の後、すべての問題RewriteRuleほぼ修正しましたが、最後の問題が 1 つあります。

  • /loginURL は常に に変わります/login.php

以下は私の更新された.htaccessです

IndexIgnore *
Options -MultiViews
Options +FollowSymLinks

#mod_rewrite
RewriteEngine on
RewriteBase /

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

# minimize the css on all http:// pages
<IfModule mod_rewrite.c>
    RewriteCond %{HTTPS} off
   RewriteRule ^(.*).css$ /csszip.php?file=$1.css [L]
</IfModule>

#switch over http to https

# Rewrite to https
RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTPS} off

RewriteCond %{REQUEST_URI} (/login|/do_login)\.php [NC]
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# don't do anything for images/css/js (leave protocol as is)
RewriteRule \.(gif|jpe?g|png|ico|css|js)$ - [NC,L]

# traffic to http:// except some pages
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} on

RewriteCond %{REQUEST_URI} !(/login|/do_login)\.php [NC]

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^login/?$ login.php [NC]
RewriteRule ^register/?$ register.php [NC]
# ...many other rules...with [NC] falg

RewriteRule ^auction/category/([^/.]+)/?$ bids.php?cid=$1 [NC]
RewriteRule ^about/?$ page.php?slug=about_us [NC]
# ...many more rules.... with [NC] flag
4

4 に答える 4

4

HTTPS の提案

HTTPS タグに関連する既知の apache の問題があるため、HTTPS の問題については、ポートまたは HTTPS で一致します。

両方でこの一致をカバーするには(編集した回答に示されているように)

RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTPS} != on

##REWRITE RULE

RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} = on

##REWRITE RULE

有効な点は%{REQUEST_URI}、置換の影響を受けないことでもあります。

現時点で使用している方法では、ルールが一致する場合、それらを元の URL に送信します (置換が開始される前)。

後にURLを取得したい場合は、置換と一致を使用します$1


その他の質問への回答:

URL の書き換えの大文字と小文字を変更すると、エラーが発生しますか?

これは[NC]、.htaccess の HTTPS セクションの書き換え条件にないためです。

RewriteCond %{REQUEST_URI} /login [OR]大文字のログインを受け入れたい場合は、NC を追加して、小文字のログインのみを探していると一致します。


すべての RewriteRule で [NC,L] を書くのは良い習慣ですか?

いいえ、それはあなたが何をしたいかによって異なります。このルールでは大文字と小文字を一致させません。そのルール(または条件[NC])で大文字と小文字を一致させたくない場合は、それを追加します。

大文字と小文字が一致しないということは、 [NC]site.com/login.php = sYte.cOm/Login.PHP を意味します。

[L]これが true の場合、すべての処理を停止することを意味します


いつ [QSA] と書くべきですか?

? がある場合に QSA が適用されます。あなたの置換で、新しいURLに古い文字列を追加したい

次のルールを検討してください。

RewriteRule /pages/(.+) /page.php?page=$1 [QSA]

[QSA]フラグを使用すると、 のリクエストが/pages/123?one=twoにマップされ/page.php?page=123&one=twoます。[QSA] フラグがないと、同じリクエストがマップされます。/page.php?page=123つまり、既存のクエリ文字列は破棄されます。

追加の get 引数を保持する場合は、QSA を使用してください。


もう一つのさらなる質問

/login URL は常に /login.php に変更されます

[R=301]これが発生する唯一の方法は、コードのどこかにリダイレクトがある場合です。私が確認できる唯一の場所は、このセクションです。

# Rewrite to https
RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTPS} != on
RewriteCond %{REQUEST_URI} (/login|/do_login)\.php [NC]
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

これは次の URL にのみ一致します

.php、/login.php、/do_login.php

犯人は、最初の回答で概説したとおりだと思います%{REQUEST_URI}

あなたのコードは本質的に、これらの条件が満たされた場合にそれらをhttps://theurltheywenttoに送信することを示しています。

使用してみましたか (私の https セクションで述べたように)

RewriteRule ^(.*) https://%{HTTP_HOST}/login [R=301,L]

またはおそらく(/ do_loginがある場合)およびその他のオプション

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

test.com/do_login.php がhttps://test.com/do_loginになる場所

試してみてはどうですか:

# Rewrite to https
RewriteCond %{REQUEST_URI} (/login|/do_login)\.php [NC]
RewriteCond %{HTTPS} != on
RewriteRule ^(.*)\.php https://%{HTTP_HOST}/$1 [R=301,L]
于 2012-09-18T11:23:46.053 に答える
1

ドメインエイリアスを作成することでこれを解決できます

内では実行できませんが.htaccesshttp.conf <VirtualHost>セクション内では、ServerNameおよびServerAliasディレクティブを使用してこれを実行できます。

于 2012-09-17T06:19:55.950 に答える
1

これはあなたの助けになるかもしれないと思います

.htaccess リダイレクト https から http へのリダイレクトが機能しない

最後の質問ですが、これはあなたの助けになるかもしれません

http://httpd.apache.org/docs/current/rewrite/flags.htmlおよび

http://www.addedbytes.com/download/mod_rewrite-cheat-sheet-v2/png/

編集: 使用してみることができます

RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{SERVER_PORT} !^443$

それ以外の

RewriteCond %{HTTPS} on [NC]
RewriteCond %{HTTPS} off [NC] 

詳しくは

このリンクを参照してください。誰かが同様の問題を抱えていました。投稿の 2 回目の返信を参照してください

http://www.webmasterworld.com/apache/3228459.htm

于 2012-09-13T07:06:41.767 に答える
0

/about に関する混乱は、置換を行っても変更されない %{REQUEST_URI} へのリダイレクトによるものです。URI をキャプチャし、この一連の書き換え処理中に開始された URI が本当に必要ない場合は、$1 を使用します。

于 2012-09-17T13:03:34.703 に答える