Index: src/java/org/apache/nutch/crawl/CrawlDbReducer.java
===================================================================
--- src/java/org/apache/nutch/crawl/CrawlDbReducer.java	(revision 1498833)
+++ src/java/org/apache/nutch/crawl/CrawlDbReducer.java	(working copy)
@@ -43,6 +43,8 @@
   private InlinkPriorityQueue linked = null;
   private ScoringFilters scfilters = null;
   private boolean additionsAllowed;
+  private boolean redirectsToMaxInterval = false;
+  private boolean goneToMaxInterval = false;
   private int maxInterval;
   private FetchSchedule schedule;
 
@@ -52,6 +54,8 @@
     additionsAllowed = job.getBoolean(CrawlDb.CRAWLDB_ADDITIONS_ALLOWED, true);
     int oldMaxInterval = job.getInt("db.max.fetch.interval", 0);
     maxInterval = job.getInt("db.fetch.interval.max", 0 );
+    redirectsToMaxInterval = job.getBoolean("db.redirects.interval.max", false);
+    goneToMaxInterval = job.getBoolean("db.gone.interval.max", false);
     if (oldMaxInterval > 0 && maxInterval == 0) maxInterval = oldMaxInterval * FetchSchedule.SECONDS_PER_DAY;
     schedule = FetchScheduleFactory.getFetchSchedule(job);
     int maxLinks = job.getInt("db.update.max.inlinks", 10000);
@@ -215,6 +219,16 @@
           }
         }
       }
+      
+      // https://issues.apache.org/jira/browse/NUTCH-1586
+      if (redirectsToMaxInterval && fetch.getStatus() == CrawlDatum.STATUS_FETCH_REDIR_PERM || fetch.getStatus() == CrawlDatum.STATUS_DB_REDIR_TEMP) {
+        result.setFetchInterval(maxInterval);
+      } else {
+        // set the schedule
+        result = schedule.setFetchSchedule(key, result, prevFetchTime,
+          prevModifiedTime, fetch.getFetchTime(), fetch.getModifiedTime(), modified);
+      }
+
       // set the schedule
       result = schedule.setFetchSchedule(key, result, prevFetchTime,
           prevModifiedTime, fetch.getFetchTime(), fetch.getModifiedTime(), modified);
@@ -249,6 +263,7 @@
             }
           }
       }
+      
       // if fetchInterval is larger than the system-wide maximum, trigger
       // an unconditional recrawl. This prevents the page to be stuck at
       // NOTMODIFIED state, when the old fetched copy was already removed with
@@ -262,7 +277,7 @@
       }   
       return;
     case CrawlDatum.STATUS_FETCH_RETRY:           // temporary failure
-      if (oldSet) {
+      if (oldSet) { 
         result.setSignature(old.getSignature());  // use old signature
       }
       result = schedule.setPageRetrySchedule(key, result, prevFetchTime,
@@ -271,6 +286,9 @@
         result.setStatus(CrawlDatum.STATUS_DB_UNFETCHED);
       } else {
         result.setStatus(CrawlDatum.STATUS_DB_GONE);
+        if (goneToMaxInterval && fetch.getStatus() == CrawlDatum.STATUS_FETCH_GONE) {
+          result.setFetchInterval(maxInterval);
+        }
       }
       break;
 
@@ -278,6 +296,9 @@
       if (oldSet)
         result.setSignature(old.getSignature());  // use old signature
       result.setStatus(CrawlDatum.STATUS_DB_GONE);
+      if (goneToMaxInterval && fetch.getStatus() == CrawlDatum.STATUS_FETCH_GONE) {
+        result.setFetchInterval(maxInterval);
+      }
       result = schedule.setPageGoneSchedule(key, result, prevFetchTime,
           prevModifiedTime, fetch.getFetchTime());
       break;
