|  | @@ -20,14 +20,14 @@ type FieldRule struct {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (this *FieldRule) Apply(dest v2net.Destination) bool {
 | 
	
		
			
				|  |  |  	address := dest.Address()
 | 
	
		
			
				|  |  | -	if len(this.Domain) > 0 && address.IsDomain() {
 | 
	
		
			
				|  |  | -		if !strings.Contains(address.Domain(), this.Domain) {
 | 
	
		
			
				|  |  | +	if len(this.Domain) > 0 {
 | 
	
		
			
				|  |  | +		if !address.IsDomain() || !strings.Contains(address.Domain(), this.Domain) {
 | 
	
		
			
				|  |  |  			return false
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	if this.IP != nil && (address.IsIPv4() || address.IsIPv6()) {
 | 
	
		
			
				|  |  | -		if !this.IP.Contains(address.IP()) {
 | 
	
		
			
				|  |  | +	if this.IP != nil {
 | 
	
		
			
				|  |  | +		if !(address.IsIPv4() || address.IsIPv6()) || !this.IP.Contains(address.IP()) {
 | 
	
		
			
				|  |  |  			return false
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
	
		
			
				|  | @@ -51,10 +51,10 @@ func (this *FieldRule) Apply(dest v2net.Destination) bool {
 | 
	
		
			
				|  |  |  func (this *FieldRule) UnmarshalJSON(data []byte) error {
 | 
	
		
			
				|  |  |  	type RawFieldRule struct {
 | 
	
		
			
				|  |  |  		Rule
 | 
	
		
			
				|  |  | -		Domain  string `json:"domain"`
 | 
	
		
			
				|  |  | -		IP      string `json:"ip"`
 | 
	
		
			
				|  |  | -		Port    *v2netjson.PortRange
 | 
	
		
			
				|  |  | -		Network *v2netjson.NetworkList
 | 
	
		
			
				|  |  | +		Domain  string                 `json:"domain"`
 | 
	
		
			
				|  |  | +		IP      string                 `json:"ip"`
 | 
	
		
			
				|  |  | +		Port    *v2netjson.PortRange   `json:"port"`
 | 
	
		
			
				|  |  | +		Network *v2netjson.NetworkList `json:"network"`
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	rawFieldRule := RawFieldRule{}
 | 
	
		
			
				|  |  |  	err := json.Unmarshal(data, &rawFieldRule)
 | 
	
	
		
			
				|  | @@ -63,17 +63,31 @@ func (this *FieldRule) UnmarshalJSON(data []byte) error {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	this.Type = rawFieldRule.Type
 | 
	
		
			
				|  |  |  	this.OutboundTag = rawFieldRule.OutboundTag
 | 
	
		
			
				|  |  | -	this.Domain = rawFieldRule.Domain
 | 
	
		
			
				|  |  | -	_, ipNet, err := net.ParseCIDR(rawFieldRule.IP)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return errors.New("Invalid IP range in router rule: " + err.Error())
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	hasField := false
 | 
	
		
			
				|  |  | +	if len(rawFieldRule.Domain) > 0 {
 | 
	
		
			
				|  |  | +		this.Domain = rawFieldRule.Domain
 | 
	
		
			
				|  |  | +		hasField = true
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if len(rawFieldRule.IP) > 0 {
 | 
	
		
			
				|  |  | +		_, ipNet, err := net.ParseCIDR(rawFieldRule.IP)
 | 
	
		
			
				|  |  | +		if err != nil {
 | 
	
		
			
				|  |  | +			return errors.New("Invalid IP range in router rule: " + err.Error())
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		this.IP = ipNet
 | 
	
		
			
				|  |  | +		hasField = true
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	this.IP = ipNet
 | 
	
		
			
				|  |  |  	if rawFieldRule.Port != nil {
 | 
	
		
			
				|  |  |  		this.Port = rawFieldRule.Port
 | 
	
		
			
				|  |  | +		hasField = true
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	if rawFieldRule.Network != nil {
 | 
	
		
			
				|  |  |  		this.Network = rawFieldRule.Network
 | 
	
		
			
				|  |  | +		hasField = true
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if !hasField {
 | 
	
		
			
				|  |  | +		return errors.New("This rule has no effective fields.")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	return nil
 | 
	
		
			
				|  |  |  }
 |