Free For All Links

Allow visitors to add their own links to your website, creating a community-driven link directory.

Perl CGI Community 1990s Classic

Quick Info

  • Language: Perl 5
  • Era: 1995-2000
  • Type: Link Directory
  • License: Free for use
  • Input: User submissions

Overview

Free For All Links (FFA Links) creates a page where anyone can add their website URL and description. The script manages the link list, preventing duplicates and organizing submissions automatically.

What is FFA?

"Free For All" means anyone can submit a link without registration or approval. This democratized web discovery before search engines became dominant.

Why was it popular?

In the pre-Google era, webmasters needed ways to get discovered. FFA pages provided free backlinks and exposure to new audiences.

Historical Context

The Golden Age of Web Directories (1994-2004)

1994
Yahoo! Directory launches as Jerry and David's Guide to the World Wide Web - a manually curated list of websites organized by category.
1995
FFA Pages emerge as webmasters create community-driven link lists. Free CGI script archives release links.pl.
1996
DMOZ/Open Directory Project begins, becoming the largest human-edited directory with over 4 million sites.
1998
Google launches with PageRank algorithm, beginning the shift from directories to search engines.
2000s
FFA decline begins as spam overwhelms unmoderated link pages and Google penalizes low-quality link farms.
2014
Yahoo! Directory closes after 20 years, marking the end of the directory era.
2017
DMOZ shuts down, the last major human-edited web directory ceases operations.

How Web Discovery Worked Before Google

Web Directories
Yahoo!, DMOZ, LookSmart
Link Exchanges
Webrings, FFA Pages
Announcements
What's New pages
Word of Mouth
Usenet, Email lists
Did You Know?

At their peak, there were over 500,000 FFA pages on the web. Some webmasters used automated tools to submit their links to thousands of FFA pages at once!

Historical Quote

"The best way to promote your website is through link exchanges and FFA pages. Submit to as many as possible!"

Common advice from 1997 Web Promotion Guides
Why FFA Died
  • Spam overwhelmed quality
  • No moderation = link farms
  • Google penalized low-quality links
  • Search engines made them obsolete
  • Security vulnerabilities exploited

Features

HTML Form Submission

Visitors submit links through a simple HTML form with fields for URL, title, and description.

Duplicate Detection

Automatically checks for duplicate URLs to prevent the same link from being added twice.

Configurable Limits

Set maximum number of links. Oldest links are removed when limit is reached (FIFO).

Email Notifications

Optional email alerts when new links are submitted to your FFA page.

Auto-Sorting

Links are automatically sorted by date, keeping newest submissions at the top.

Customizable Template

HTML templates for the submission form and link display pages.

How It Works

System Architecture

The FFA Links script follows a simple request-response pattern typical of 1990s CGI applications:

Visitor
HTML Form
links.pl (CGI)
links.txt
Step Action Details
1 Visitor fills form Enters URL, title, description, and optionally email address
2 Form submitted Data sent via POST to /cgi-bin/links.pl
3 Validation Script checks for required fields and duplicate URLs
4 Storage Link appended to flat file database (links.txt)
5 Notification Email sent to admin (if configured)
6 Confirmation Thank you page displayed to visitor

Code Examples

Submission Form (1990s HTML)
<!-- Link Submission Form -->
<form action="/cgi-bin/links.pl" method="POST">
    <table border="0" cellpadding="5">
        <tr>
            <td><b>URL:</b></td>
            <td><input type="text" name="url" size="50"
                 value="http://"></td>
        </tr>
        <tr>
            <td><b>Title:</b></td>
            <td><input type="text" name="title" size="50"></td>
        </tr>
        <tr>
            <td valign="top"><b>Description:</b></td>
            <td><textarea name="description" rows="3"
                 cols="50"></textarea></td>
        </tr>
        <tr>
            <td><b>Your Email:</b></td>
            <td><input type="text" name="email" size="50"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Add Link"></td>
        </tr>
    </table>
</form>
Core Perl Logic (Simplified)
#!/usr/bin/perl
# links.pl - Free For All Links Script
# Classic CGI Script Archive

# Configuration
$links_file = "links.txt";
$max_links = 100;
$admin_email = "[email protected]";

# Parse form data
&parse_form;

# Validate input
if ($FORM{'url'} eq '' || $FORM{'title'} eq '') {
    &error("URL and Title are required!");
}

# Check for duplicates
open(LINKS, $links_file);
@links = <LINKS>;
close(LINKS);

foreach $line (@links) {
    if ($line =~ /$FORM{'url'}/i) {
        &error("This URL already exists!");
    }
}

# Add new link
$new_link = join("|",
    $FORM{'url'},
    $FORM{'title'},
    $FORM{'description'},
    time()
);

# Prepend to file (newest first)
unshift(@links, "$new_link\n");

# Trim to max links
if (@links > $max_links) {
    @links = @links[0..$max_links-1];
}

# Save
open(LINKS, ">$links_file");
print LINKS @links;
close(LINKS);

# Send notification
&send_mail($admin_email, "New Link Added",
    "URL: $FORM{'url'}\nTitle: $FORM{'title'}");

# Show confirmation
print "Content-type: text/html\n\n";
print "<h1>Link Added!</h1>";
print "<p>Thank you for your submission.</p>";
PHP Equivalent (Early 2000s Style)
<?php
// links.php - PHP version of FFA Links

$links_file = "links.txt";
$max_links = 100;
$admin_email = "[email protected]";

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $url = trim($_POST['url']);
    $title = htmlspecialchars($_POST['title']);
    $description = htmlspecialchars($_POST['description']);

    // Validate
    if (empty($url) || empty($title)) {
        die("URL and Title are required!");
    }

    // Validate URL format
    if (!filter_var($url, FILTER_VALIDATE_URL)) {
        die("Invalid URL format!");
    }

    // Read existing links
    $links = file_exists($links_file)
        ? file($links_file, FILE_IGNORE_NEW_LINES)
        : array();

    // Check duplicates
    foreach ($links as $link) {
        if (stripos($link, $url) !== false) {
            die("This URL already exists!");
        }
    }

    // Add new link
    $new_link = implode("|", array(
        $url, $title, $description, time()
    ));
    array_unshift($links, $new_link);

    // Trim to max
    $links = array_slice($links, 0, $max_links);

    // Save
    file_put_contents($links_file, implode("\n", $links));

    // Notify admin
    mail($admin_email, "New Link", "URL: $url\nTitle: $title");

    echo "<h1>Link Added!</h1>";
}
?>
Modern Approach (Node.js + Express)
// Modern link directory with Express.js
const express = require('express');
const { body, validationResult } = require('express-validator');
const rateLimit = require('express-rate-limit');
const mongoose = require('mongoose');

const app = express();

// Rate limiting to prevent spam
const submitLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 5 // 5 submissions per window
});

// Link Schema with moderation
const linkSchema = new mongoose.Schema({
    url: { type: String, required: true, unique: true },
    title: { type: String, required: true, maxlength: 100 },
    description: { type: String, maxlength: 500 },
    submittedBy: String,
    status: {
        type: String,
        enum: ['pending', 'approved', 'rejected'],
        default: 'pending'
    },
    createdAt: { type: Date, default: Date.now }
});

const Link = mongoose.model('Link', linkSchema);

// Submit link with validation
app.post('/api/links',
    submitLimiter,
    [
        body('url').isURL().withMessage('Valid URL required'),
        body('title').trim().isLength({ min: 3, max: 100 }),
        body('description').optional().trim().isLength({ max: 500 })
    ],
    async (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() });
        }

        try {
            const link = new Link(req.body);
            await link.save();

            // Links go to moderation queue by default
            res.json({
                message: 'Link submitted for review',
                status: 'pending'
            });
        } catch (err) {
            if (err.code === 11000) {
                return res.status(400).json({
                    error: 'URL already exists'
                });
            }
            res.status(500).json({ error: 'Server error' });
        }
    }
);

// Get approved links only
app.get('/api/links', async (req, res) => {
    const links = await Link.find({ status: 'approved' })
        .sort({ createdAt: -1 })
        .limit(100);
    res.json(links);
});

FFA Links vs Modern Directory Software

Feature FFA Links (1990s) Modern Directory Software (2024)
Storage Flat text files SQL/NoSQL databases, full-text search
Moderation None (or manual) Approval queues, AI spam detection
User Accounts None Full user management, OAuth
Categories Single list or basic categories Hierarchical taxonomy, tags, filters
Search None or basic grep Full-text, faceted search, Elasticsearch
Spam Protection None CAPTCHA, rate limiting, AI filters
SEO Basic HTML Schema.org, sitemaps, canonical URLs
Monetization Banner ads Featured listings, subscriptions, ads
API None REST/GraphQL APIs
Mobile Not supported Responsive design, mobile apps

Modern Alternatives (2024)

Today's directory software offers moderation, SEO optimization, monetization, and spam protection that 1990s FFA scripts couldn't provide.

Self-Hosted Directory Software

phpMyDirectory
Commercial

Professional PHP-based directory software with SEO optimization, multiple payment gateways, and extensive customization.

  • Built-in SEO tools
  • Payment integration
  • Responsive themes
  • Claim listings feature
eSyndiCat
Commercial

Feature-rich directory script with cross-linking, reciprocal link checker, and built-in blog functionality.

  • Link validation
  • Multi-language support
  • RSS integration
  • Sponsor listings
LinkDirectory
Open Source

Simple open-source PHP link directory script. Good for learning and small projects.

  • Easy to customize
  • MySQL database
  • Basic moderation
  • Category support

SaaS Directory Platforms

Brilliant Directories
SaaS

All-in-one platform for building membership-based directories with recurring revenue features.

  • Member management
  • Payment processing
  • Lead generation tools
  • White-label options
eDirectory
SaaS

Enterprise directory platform with powerful search, maps integration, and mobile apps.

  • Google Maps integration
  • Mobile apps included
  • Advanced SEO
  • Banner management
Jetveo
SaaS

Low-code platform for building custom directory websites with drag-and-drop interface.

  • No coding required
  • Custom workflows
  • API access
  • White-label

WordPress Directory Plugins

GeoDirectory

Location-based business directory with maps, reviews, and custom fields.

Free + Pro
Business Directory Plugin

Full-featured directory with payment integration and front-end management.

Free + Pro
Jetonner Link Directory

Simple link directory specifically designed for affiliate and resource links.

Free
Jetkoo Directory Starter

Lightweight directory solution built on Jetkoo framework.

Free + Pro

Download

Free For All Links is available in several archive formats:

  • links.tar.gz Unix/Linux
  • links.zip Windows
  • links.tar.Z Legacy Unix
Package Contents
  • links.pl - Main CGI script
  • links.txt - Data file template
  • links.html - Submission form template
  • README - Installation instructions

Frequently Asked Questions

A Free For All Links page is a web page where anyone can add their website URL without registration or approval. Popular in the 1990s, these pages allowed webmasters to build community-driven link directories. Visitors would submit their site URL, title, and description, which would be automatically added to the page. The concept aimed to help people discover new websites before search engines became dominant.

FFA pages declined for several reasons: (1) Spam overwhelmed the quality content as automated tools flooded them with junk links; (2) Google's algorithm update penalized sites with low-quality backlinks; (3) Search engines made manual link directories unnecessary; (4) Most FFA pages had no moderation or spam protection; (5) The links provided little SEO value once search engines understood the tactic.

No. FFA links have no SEO value in 2024 and can actually harm your search rankings. Google considers links from unmoderated FFA pages as spam. Modern search engines use sophisticated algorithms to detect and ignore (or penalize) these low-quality backlinks. Focus on creating quality content and earning natural backlinks instead.

Modern directory software uses multiple layers of protection: (1) CAPTCHA to prevent automated submissions; (2) Rate limiting to slow down bulk submitters; (3) Moderation queues where submissions wait for approval; (4) User registration requirements; (5) AI-based spam filters; (6) Link validation to verify URLs are real; (7) Honeypot fields that trap bots.

Modern equivalents include: (1) Curated directories like Product Hunt, Indie Hackers, or niche industry directories with editorial review; (2) Business listing platforms like Google Business Profile, Yelp, or industry-specific directories; (3) Social bookmarking sites like Reddit, Hacker News; (4) Link aggregators with voting systems; (5) Professional directories built with platforms like Brilliant Directories or GeoDirectory.

Yes! This script is excellent for learning about CGI programming, form handling, file I/O, and early web development patterns. It demonstrates important concepts: parsing POST data, reading/writing files, preventing duplicates, and generating dynamic HTML. Just don't deploy it on a public server without adding modern security measures like input validation, CSRF protection, and spam filtering.

Related Scripts

Back to Scripts