サブドメイン(ユーザー)が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>
私が抱えていた問題は、実際に私が見ている場所とは関係ありませんでした...
それは
RewriteCond %{HTTP_Host} ^www.mysite.com$ [NC]
RewriteRule ^(.*)$ - [L]
[L]オプションは、実際にmod_rewriteが、favicon.icoコードがあった場所で、beflowを処理することさえできませんでした。
私はその規則と条件を取り除き、それは魅力のように働きました。
この形式のディレクティブは意味不明ですよね?
RewriteCond ^(.+)favicon.ico !-f
最初のパラメータは正規表現ではなく、変数補間された文字列であるため、常に失敗します。最初のparmから正規表現を削除した後でも、favicon.icoを探すためのパスの後方参照やプレフィックスなどを追加する必要があります。
それがあなたの唯一の犯人ですか?
RewriteRulesの一部には、偽の条件が組み込まれています。
RewriteRule ^(?:www\.)?([^.]+?)\.mysite\.com/media/(.*) ...
そのオプションのwww。仮想ホストコンテキストのRewriteRuleは常に「/」で始まる文字列と一致するため、そこに存在することはできません。これは、範囲が常に先頭のスラッシュと一致することを意味します。
さらに、一致するURLパスに「mysite.com」が含まれるのはなぜですか? HTTP_HOSTを突くために別のRewriteCondを作成しましたか?
RewriteLogを使用すると、これはおそらくもう少し明らかになります。