web-dev-qa-db-ja.com

1つのページを除くすべてのURLをリダイレクトするリダイレクトルールの問題

次のApacheリダイレクトルールを.htaccessに追加する必要があります。

http://www.example.comhttp://www.onemoreexample.comにリダイレクトされます

ただし、http://www.example.com/supportはリダイレクトしないでください。

これを実現するために、以下のリダイレクトルールを追加しました。

 RewriteCond %{REQUEST_URI} !^/support/
 RewriteRule ^(.*)$ http://www.onemoreexample.com/$1 [R=302,L]

しかし、上記のルールを追加した後、http://www.example.com/support/http://www.onemoreexample.com/support/に連れて行ってくれます

上記のルールの前に、wwwにリダイレクトする次のルールもあります。

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

私の.htaccessファイルは次のようになります

   RewriteEngine On
   RewriteBase /
   RewriteRule ^index\.php$ - [L]

   # add a trailing slash to /wp-admin
   RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

   RewriteCond %{REQUEST_FILENAME} -f [OR]
   RewriteCond %{REQUEST_FILENAME} -d
   RewriteRule ^ - [L]
   RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
   RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
   RewriteRule . index.php [L]

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

   RewriteCond %{REQUEST_URI} !^/support/
   RewriteRule ^(.*)$ http://www.onemoreexample.com/$1 [R=302,L]

これを解決する方法を提案してください。

1
Zama Ques

独立して、リダイレクトディレクティブ自体は問題ないので、何か他のことが起こっているはずです...

.htaccessファイル全体を見て、リダイレクトディレクティブを配置した状態で、リダイレクトディレクティブが実際に何かを実行していることに驚いています(?!)。 .htaccessファイルの終わり、WordPressマルチサイトディレクティブの後。

/supportという物理ディレクトリ(またはファイル)がないため、WordPressはこの要求を/index.phpbeforeに書き換えますリダイレクトが発生し、リダイレクトが処理される前に処理が停止します(したがって、これがリクエストをリダイレクトしているように見える方法は明らかではありません-明らかな推測は、キャッシュされたリダイレクトが表示されていることです(おそらく、以前のいくつかのテストの後)-または何か他のものそれがリダイレクトをトリガーしているのですか?)

通常、外部リダイレクトは常に.htaccessファイルの先頭に、before書き換えの前に配置する必要があります。したがって、.htaccessファイルは次のようになります。

RewriteEngine On
RewriteBase /

# External redirects...
RewriteCond %{REQUEST_URI} !^/support/
RewriteRule ^(.*)$ http://www.onemoreexample.com/$1 [R=302,L]

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


# WordPress multisite rewrites...
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

テストの前に、ブラウザのキャッシュがクリアされていることを確認する必要があります。

PDATE#1:解決するがCSSが壊れる

上記は、/support/... URL-pathプレフィックスで参照されていない静的リソース(CSS、JS、画像)もリダイレクトします。対応するCSSファイルがリダイレクトされたドメインにもない場合、CSSは機能しなくなります。これはおそらくここで何が起こっているのでしょう...(しかし、これらが共有/共通のCSSリソースであると仮定すると、リダイレクトされたすべてのページでもこれが壊れると思いますか?/support/ページで使用されるCSSが一意でない限り、 )。

CSSおよびその他の静的リソースを除外するには、別の例外を追加する必要があります。例えば:

# Redirect everything except "/support/..." and other static resources
RewriteCond %{REQUEST_URI} !^/support/
RewriteCond %{REQUEST_URI} !\.(css|js|jpg|gif|png)$
RewriteRule ^(.*)$ http://www.onemoreexample.com/$1 [R=302,L]

PDATE#2もう1つの問題... http://www.example.com/support/wp-adminもリダイレクトすべきではありませんが、http://www.onemoreexample.com/wp-login.phpにリダイレクトされています。

ここでの問題は、/support/wp-adminが最初に/wp-login.phpにリダイレクトされることです(/support/接頭辞なし)WordPress)によってリダイレクトされます上記のディレクティブを使用して他のドメインにアクセスするため、/wp-login.phpにアクセスする認証されていないユーザーがリダイレクトされないようにする場合は、/support/wp-adminも例外にする必要があります。

たとえば、代わりに次のようなものを読み取るように最初の条件を変更します。

RewriteCond %{REQUEST_URI} !^/(support/|wp-login\.php$)
1
MrWhite

/?を追加して、オプションで末尾のスラッシュもルールで考慮します。

RewriteCond %{REQUEST_URI} !^/support/?
RewriteRule ^(.*)$ http://www.onemoreexample.com/$1 [R=302,L]
0
Abhishek Gurjar