私はサブドメインを次のようなフォルダ/ファイルに書き換えようとしています:
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によって上書きされる可能性があることです。これが私がそこに何も置きたくない理由です。
最後の行を変更しようとすると、内部サーバーエラーが発生します
RewriteRule (.*) /agents/%1/ [L]
これは、内部書き換えループが発生するためです。 URLパスも保持するように見えます(これがおそらくRewriteRule
patternをキャプチャしている理由ですが、現在破棄されています)。
書き換えループを防止し、RewriteRule
substitutionを変更するには、追加の条件が必要です。例えば:
# profile redirection
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_Host} ^(.+)\.example\.com [NC]
RewriteRule (.*) /profile/%1/$1 [L]
空のREDIRECT_STATUS
(環境変数)をチェックすると、書き換えられたリクエストではなく、最初のリクエストのみが書き換えられます。
これは、サブドメインとメインドメインがすべてファイルシステム上の同じ場所を指していることも想定しています(@Stephenがコメントで尋ねたように)。
$1
は、RewriteRule
patternでキャプチャされたグループへの後方参照です。
または、否定のRewriteRule
patternを使用し、/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.com
(WP_HOME
PHP定数で定義)。これを防ぐには、WP_SITEURL
のWP_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