web-dev-qa-db-ja.com

サブドメインを維持しながら、メインドメイン上の対応するフォルダーに.htaccessのワイルドカードサブドメインを書き換えます

私はサブドメインを次のようなフォルダ/ファイルに書き換えようとしています:

  • name.example.com-> example.com/profile/name
  • foo.example.com-> example.com/profile/foo
  • xyzzy.example.com-> example.com/profile/xyzzy

これは、メインドメインと同じフォルダーを指すワイルドカードサブドメインです。

メインドメインルートの.htaccessに次のコードがあります。

RewriteEngine On
RewriteBase /

#force https and non-www
RewriteCond %{HTTP_Host} ^(www\.)(.+) [OR]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_Host} ^(www\.)?(.+)
RewriteRule ^ https://%2%{REQUEST_URI} [R=301,L]

# profile redirection
RewriteCond %{HTTP_Host} ^(.*)\.example\.com [NC]
RewriteRule (.*) https://example.com/profile/%1/ [L]

うまくいきますが、元のURL name.example.comを保持したいです

最後の行を変更しようとすると、内部サーバーエラーが発生します

RewriteRule (.*) /profile/%1/ [L]

成功せずにいくつかの異なるソリューションを試しました。明らかに、私は間違っています。

元のURLを保持するにはどうすればよいですか?

編集:


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

最適化されていませんが、問題は# BEGIN WordPress# END WordPressの間のすべてがWordpressによって上書きされる可能性があることです。これが私がそこに何も置きたくない理由です。

6
aatanasow

最後の行を変更しようとすると、内部サーバーエラーが発生します

RewriteRule (.*) /agents/%1/ [L]

これは、内部書き換えループが発生するためです。 URLパスも保持するように見えます(これがおそらくRewriteRulepatternをキャプチャしている理由ですが、現在破棄されています)。

書き換えループを防止し、RewriteRulesubstitutionを変更するには、追加の条件が必要です。例えば:

# profile redirection
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_Host} ^(.+)\.example\.com [NC]
RewriteRule (.*) /profile/%1/$1 [L]

空のREDIRECT_STATUS(環境変数)をチェックすると、書き換えられたリクエストではなく、最初のリクエストのみが書き換えられます。

これは、サブドメインとメインドメインがすべてファイルシステム上の同じ場所を指していることも想定しています(@Stephenがコメントで尋ねたように)。

$1は、RewriteRulepatternでキャプチャされたグループへの後方参照です。


または、否定のRewriteRulepatternを使用し、/profile/をまだ開始していないリクエストのみを書き換えて、REQUEST_URIサーバー変数を使用することもできます。代わりにsubstitutionで(標準リダイレクトで行うように)。例えば:

# profile redirection
RewriteCond %{HTTP_Host} ^(.+)\.example\.com [NC]
RewriteRule !^profile/ /profile/%1%{REQUEST_URI} [L]

REDIRECT_STATUSに対するチェックは不要です。

これは、1つ少ないRewriteCondディレクティブを除いて、最初のルールブロックと非常によく似た動作をします。ただし、このアプローチのわずかな注意点は、/profile/(つまり、/profile/profile/のようなファイルシステムパスにマップされる)を開始する要求されたURLパスを取得できなかったことです。ありそうもない。


UPDATE:WordPressを使用しているため、WordPress自体が正規ドメインへの外部リダイレクトをトリガーしている可能性があります。 example.comWP_HOME PHP定数で定義)。これを防ぐには、WP_SITEURLWP_HOMEおよびwp-config.php定数を動的にに設定して、ホスト名(つまり、メインドメインにハードコーディングされる代わりに、サブドメインが要求されます。

例えば:

define('WP_SITEURL','http://'.$_SERVER['HTTP_Host']);
define('WP_HOME','http://'.$_SERVER['HTTP_Host']);

(注:これは、HTTPSではなくHTTPを想定しています。)

参照:
https://codex.wordpress.org/Editing_wp-config.php#WP_SITEURL

2
MrWhite