3

サブドメインをWeb ルートの上にあるディレクトリに書き換えるのに少し問題があります。私は以前に mod_rewrite について多くの経験を積んできましたが、この特定の問題は私には理解できません。

私が知る限り..、サブドメイン ファイルが配置されているディレクトリを決定するために相対ディレクトリ ( ) を使用することを主張しているため、mod_rewrite は癇癪を起こしています。

残念ながら、私のクライアントの仕様には 2 つの制限があります。

  • サブドメインを Web ルートのサブディレクトリとして配置することはオプションではありません。サブドメインは、特定のサブドメイン以外のどこからでもアクセスできてはなりません (ディレクトリの競合が発生する可能性があります)。これは、そのディレクトリがルート ドメインのアプリケーションで使用される可能性があるため、からアクセスできないhttp://subdomain.example.com/ことを意味します。http://example.com/subdomain/
  • 共有ホスティングが使用されるため、サブドメイン ファイルへの絶対パスはクライアントに認識されません。

誰かがこの問題で私を助けることができれば、それは大歓迎です! 将来のプロジェクトでもこれを使い始めたいと思っています。これは、現在サブドメインを処理する方法と比較して非常にエレガントなソリューションです...誰かがそれを機能させることができれば!

編集:私が期待していたよりもむしろ、要求http://subdomain.example.com/すると返されることを指摘することは有用かもしれないと考えました。ルート ドメインを要求すると、すべてが期待どおりに機能します。400 Bad Request500 Internal Server Error

現在の.htaccessファイル。

# Begin Rewrite Module for http://*.example.com/
# ==============================================
<IfModule mod_rewrite.c>

    # Turn the rewrite engine on.
    RewriteEngine On
    RewriteBase /

    # Map subdomains to their respective directories.
    RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$
    RewriteRule (.*) /../public_subdomains/%1/$1 [L]

    # Rewrite all requests for the root domain to always be served through "index.php".
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) /index.php/$1 [L]

</IfModule>

現在のディレクトリ構造。

/
    application/
    cgi-bin/
    framework/
    public_html
        public/
            css/
            images/
            js/
        .htaccess
        index.php
    public_subdomains/
        mysubdomain/
            index.php
        anothersubdomain/
            index.php
4

1 に答える 1

1

これを実装する方法は、ホストがサブドメインを実装する方法によって異なります。単純に DOCROOT にマップするものもあります。他の人は、そのサブドメイン -> サブドメイン docroot を自分で実行できるようにするコントロール パネルを提供します。(2)が当てはまる場合は、あなたが望むものはすでに提供されているので、この回答では(1)を仮定します。

最初に注意すべき点は、ディレクトリごとの htaccess コンテキストでの書き換えは、実際には DOCROOT 階層に失敗した URI マッピングであるということです。".." は許可されておらず、500 がスローされます。実際には、ドメインの DOCROOT 内でスタックしています。

したがって、 public_domainsは DOCROOT のサブディレクトリでなければなりませんpublic_html- あなたの場合です。

ただしpublic_html/public_domains、 簡単なルールでへの直接アクセスを簡単に防ぐことができます。

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI}         /public_domains(/|$)
RewriteRule ^                      -                 [F,L]

詳細なヒントについては、 .htaccess 書き換えルールのデバッグに関する私のヒントを参照してください。エントリ パスで public_domains を使用したリクエストに対してのみ barf を実行する必要があります。また、先頭の / を含めないことと、ターゲットが / のベースの DOCROOT に関連していることにも注意してください。

于 2013-02-11T00:39:30.393 に答える