web-dev-qa-db-ja.com

robots.txtおよびfavicon.icoの書き換え

サブドメイン(ユーザー)がrobots.txt、favicon.ico、およびcrossdomain.xmlを配置した場所にデフォルト設定するいくつかのルールを設定しました

したがって、ユーザーがサイトを作成すると

testing.mywebsite.comおよびtesting.mywebsite.com/favicon.icoで独自のfavicon.icoを作成しない場合、/misc/favicon.icoにあるfavicon.icoを使用します

これは完璧に機能しますが、メインのWebサイトでは機能しません。 mywebsite.com/favicon.icoにアクセスしようとすると、「/」が存在するかどうかがチェックされます。そして、/misc/favicon.icoにリダイレクトすることはありません

両方のインスタンスが/misc/favicon.icoにリダイレクトされるように取得するにはどうすればよいですか?

    # Set all crossdomain (openxxx file) favorite icons and robots.txt doesnt exist on their
    # side, then redirect to site's just to have something to go on.
RewriteCond     %{REQUEST_URI}          crossdomain.xml$
RewriteCond     ^(.+)crossdomain.xml    !-f
RewriteRule     ^(.*)$                  /misc/crossdomain.xml [L]

RewriteCond     %{REQUEST_URI}          favicon.ico$
RewriteCond     ^(.+)favicon.ico        !-f 
RewriteRule     ^(.*)$                  /misc/favicon.ico [L]

RewriteCond     %{REQUEST_URI}          robots.txt$
RewriteCond     ^(.+)robots.txt         !-f 
RewriteRule     ^(.*)$                  /misc/robots.txt [L]

編集:

診断に役立つ場合、ここに私の完全なVhostがあります:

<VirtualHost *>
        ServerName www.mysite.com
        ServerAdmin [email protected]
        DocumentRoot /var/www/mysite/
        <Directory /var/www/mysite/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>


        ErrorLog /var/log/Apache2/mysite_error.log
        LogLevel warn

        CustomLog /var/log/Apache2/mysite_access.log combined
        ServerSignature on

        RewriteEngine   on        

        #RewriteLog     "/var/log/Apache2/rewrite.log"
        #RewriteLogLevel 9



        RewriteCond     %{HTTP_Host}            ^www.mysite.com$   [NC]
        RewriteRule     ^(.*)$                  - [L]


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


        # If there is a subdomain and the subdomain has a /home/ directory attached to it then
        # rewrite the HTTP_Host into the URI so we can process it. If its /media/, go to their
        # media folder, otherwise to their www folder.

        RewriteCond     %{HTTP_Host}                                 ^(?:www\.)?(.+?)\.mysite\.com$
        RewriteCond     /home/%1/                                    -d
        RewriteRule     ^(.+)                                        %{HTTP_Host}$1

        RewriteRule     ^(?:www\.)?([^.]+?)\.mysite\.com/media/(.*) /home/$1/xxx/media/$2 [L]
        RewriteRule     ^(?:www\.)?([^.]+?)\.mysite\.com/(.*)       /home/$1/www/$2




        # Set all crossdomain (openpalace file) favorite icons and robots.txt doesnt exist on their
        # side, then redirect to mainsite's just to have something to go on.
        RewriteCond     %{REQUEST_URI}          crossdomain.xml$
        RewriteCond     ^(.+)crossdomain.xml    !-f
        RewriteRule     ^(.*)$                  /misc/crossdomain.xml [L]

        RewriteCond     %{REQUEST_URI}          favicon.ico$
        RewriteCond     ^(.+)favicon.ico        !-f 
        RewriteRule     ^(.*)$                  /misc/favicon.ico [L]

        RewriteCond     %{REQUEST_URI}          robots.txt$
        RewriteCond     ^(.+)robots.txt         !-f 
        RewriteRule     ^(.*)$                  /misc/robots.txt [L]




        # Same as above but this is for if the directory doe's not exist. Typically it would be
        # wise to put this into a skip to emulate an if/else but it would also match if the 
        # HTTP_Host was anything. The skip If/Else method only works with 1 IF, 2
        # Don't put this as the last thing, there could be redirects later on that may not have a
        # /home/ dir but are just shortcuts to things, like inbox.mysite.com

        RewriteCond     %{HTTP_Host}                                 ^(?:www\.)?(.+?)\.mysite\.com$
        RewriteCond     /home/%1/                                    !-d        
        RewriteRule     ^(.*)$                                       http://www.mysite.com$1 [R=302]





        #Extract the subdomain (if there is one), domain, and tld. Check id the domain exists in
        #/home/. If it does then rewrite URL to http_Host and then see if it can apply to media.
        # There has to be two pairs of rewriteCond because it only applies to the next rule.

                                                                      #www.   domain .   tld
        RewriteCond     %{HTTP_Host}                                ^(?:.*\.)?([^.]+)\.(?:[^.]+)$
        RewriteCond     /home/%1/                                   -d
        RewriteRule     ^(.+)                                       %{HTTP_Host}$1 [C]
        RewriteRule     ^(?:.*\.)?([^.]+)\.(?:[^.]+?)/media/(.*)$    /home/$1/xxx/media/$2 [L] 

                                                                       #www.   domain .   tld
        RewriteCond     %{HTTP_Host}                                ^(?:.*\.)?([^.]+)\.(?:[^.]+)$
        RewriteCond     /home/%1/                                   -d
        RewriteRule     ^(?:.*\.)?([^.]+)\.(?:[^.]+?)/(.*)$          /home/$1/www/$2 [L] 


</VirtualHost>
3
ParoX

私が抱えていた問題は、実際に私が見ている場所とは関係ありませんでした...

それは

    RewriteCond     %{HTTP_Host}            ^www.mysite.com$   [NC]
    RewriteRule     ^(.*)$                  - [L]

[L]オプションは、実際にmod_rewriteが、favicon.icoコードがあった場所で、beflowを処理することさえできませんでした。

私はその規則と条件を取り除き、それは魅力のように働きました。

1
ParoX

この形式のディレクティブは意味不明ですよね?

   RewriteCond     ^(.+)favicon.ico        !-f 

最初のパラメータは正規表現ではなく、変数補間された文字列であるため、常に失敗します。最初のparmから正規表現を削除した後でも、favicon.icoを探すためのパスの後方参照やプレフィックスなどを追加する必要があります。

それがあなたの唯一の犯人ですか?

RewriteRulesの一部には、偽の条件が組み込まれています。

    RewriteRule     ^(?:www\.)?([^.]+?)\.mysite\.com/media/(.*) ...

そのオプションのwww。仮想ホストコンテキストのRewriteRuleは常に「/」で始まる文字列と一致するため、そこに存在することはできません。これは、範囲が常に先頭のスラッシュと一致することを意味します。

さらに、一致するURLパスに「mysite.com」が含まれるのはなぜですか? HTTP_HOSTを突くために別のRewriteCondを作成しましたか?

RewriteLogを使用すると、これはおそらくもう少し明らかになります。

1
covener