<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Perishable Press</title>
	
	<link>http://perishablepress.com</link>
	<description>WordPress, Web Design, Code &amp; Tutorials</description>
	<lastBuildDate>Sun, 16 Jun 2013 19:20:01 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<feedburner:info uri="perishablepress" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><meta xmlns="http://pipes.yahoo.com" name="pipes" content="noprocess" /><image><link>http://perishablepress.com/</link><url>http://feeds.feedburner.com/~fc/perishablepress?bg=cccccc&amp;amp;fg=333333</url><title>Perishable Press</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://perishablepress.com/feed/" /><feedburner:emailServiceId>perishablepress</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://perishablepress.com/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Fperishablepress.com%2Ffeed%2F" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><feedburner:browserFriendly>Perishable Press provides high-quality, in-depth articles on web design and development, graphic design, social media, blogging, software, and more. Learn how to use WordPress, PHP, SQL, HTAccess, JavaScript, (X)HTML, and CSS to create beautiful sites that are usable, accessible, and secure.</feedburner:browserFriendly><item>
		<title>Set Up WordPress MultiSite on MAMP</title>
		<link>http://perishablepress.com/wordpress-multisite-mamp/</link>
		<comments>http://perishablepress.com/wordpress-multisite-mamp/#comments</comments>
		<pubDate>Sun, 10 Mar 2013 03:00:58 +0000</pubDate>
		<dc:creator>Jeff Starr</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[multisite]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://perishablepress.com/?p=15089</guid>
		<description><![CDATA[In this tutorial, you&#8217;ll learn how to install and run WordPress MultiSite on a MAMP webserver. Running multiple sites from a single installation simplifies and streamlines administration, and serving it all from a locally installed version of MAMP gives you everything you need to develop your network of sites for the Web. WordPress enables you to create multiple websites from a single installation, requiring only one database and one set of files for thousands or even millions [...]]]></description>
				<content:encoded><![CDATA[<p><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/mamp-wordpress.jpg" alt="MAMP + WordPress" /> In this tutorial, you&#8217;ll learn how to install and run WordPress MultiSite on a <abbr title="Mac, Apache, MySQL, PHP">MAMP</abbr> webserver. Running multiple sites from a single installation simplifies and streamlines administration, and serving it all from a locally installed version of MAMP gives you everything you need to develop your network of sites for the Web.</p>
<p><span id="more-15089"></span></p>
<p><a href="http://wordpress.org/">WordPress</a> enables you to create multiple websites from a single installation, requiring only one database and one set of files for thousands or even millions of sites. But it does require some tweaking and experimenting to really get the hang of WordPress MultiSite, so doing it on a live server may not be for everyone. Fortunately MAMP enables you to set up your very own local server environment in a matter of seconds on your Mac OS X machine. This is perfect for setting up WP MultiSite and developing your sites safely and securely behind the scenes.</p>
<h2>Requirements</h2>
<ul>
<li><strong>Knowledge needed:</strong> WordPress, familiarity with Apache, MySQL, PHP</li>
<li><strong>Requires:</strong> WordPress, MAMP, Mac OS X (version 10.4.0 or later)</li>
<li><strong>Project time:</strong> 1 &ndash; 2 hours</li>
</ul>
<p>If you&#8217;re not a Mac, check out these <a href="http://perishablepress.com/run-wordpress-locally/">_AMP alternatives for setting up WordPress locally</a>.</p>
<h2>Getting Started</h2>
<p>To set up your own local server environment with MAMP, <a href="http://mamp.info/">visit their website</a> and download the free version to follow along with this tutorial, or grab the Pro version for greater functionality and flexibility. Then of course you&#8217;ll also need the latest version of WordPress, which is currently at 3.5.1. You can grab the latest from <a href="http://wordpress.org/download/">WordPress.org/download</a>. Note that MAMP requires that your Mac is running Mac OS X 10.4.x or better.</p>
<p>Once you&#8217;ve downloaded MAMP and WordPress, you&#8217;re all set for the tutorial, which guides you step-by-step through the process of installing and configuring MAMP and WordPress for local testing and development. Upon completion, you&#8217;ll have a robust, flexible, and secure platform for developing your own network of sites.</p>
<h2>Overview &#8211; What, How, and Why</h2>
<p>Before diving in, it&#8217;s important to have a solid understanding of how everything works, sort of like seeing the &#8220;big picture&#8221; of what&#8217;s happening. The first thing we&#8217;re doing is installing and configuring MAMP, which stands for Mac, Apache, MySQL, and PHP, and basically provides you with a fully functional server environment on your Mac computer. So instead of trying to do it &#8220;gorilla-style&#8221; and develop multiple WordPress sites on a live server, MAMP enables you to build and test everything from the safety and comfort of your local machine.</p>
<p>Then after setting up MAMP, you&#8217;re ready to roll tough with WP MultiSite, which gives you the power and flexibility to build and operate multiple sites from a single installation of WordPress. Setting up WP MultiSite requires a little more configuring than regular, single-site WordPress, and so getting everything working on a local server environment like MAMP is a smart way to maintain control over the entire process.</p>
<p>That said, let&#8217;s start by installing and configuring MAMP, and then move on to setting up WordPress MultiSite. Along the way, we&#8217;ll provide some additional tips and tricks to help you get the most out of the experience.</p>
<h2>Setting up MAMP</h2>
<p>In the first part of the tutorial, we&#8217;ll install and configure MAMP on your local Mac machine. Once MAMP is set up and working properly, you&#8217;ll have a robust, flexible platform on which to develop and test anything that requires Apache, MySQL, and PHP. This alone is a powerful tool to have in your belt, and in the second part of the tutorial, you&#8217;ll learn how to set up WordPress MultiSite for virtually endless site-building possibilities.</p>
<h3>Step 1: Installing MAMP</h3>
<p><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/mamp-widget.jpg" alt="MAMP Widget" title="After installation, the two-sided MAMP widget is displayed on the Mac Dashboard." /> Once you&#8217;ve downloaded the latest version of MAMP, double-click the disk image and drag &#8220;MAMP&#8221; (not &#8220;MAMP PRO&#8221;) to your Applications folder. Note that you&#8217;ll need administrator permissions to install the MAMP software.</p>
<p>After installation, all of your MAMP files will be available in the <code>Applications/MAMP</code> directory. To facilitate expediency, you may want to create a shortcut to the MAMP directory and/or the <code>MAMP.app</code> application file.</p>
<p>MAMP also provides a handy Dashboard widget for direct control over your MAMP servers. To install the MAMP widget, copy the file <code>Mamp Control.wdgt</code> from the MAMP directory to the Widgets directory located at <code>~/Library/Widgets</code>. The widget should work immediately when viewing your dashboard (see screenshot), but if it doesn&#8217;t you may need to reboot and/or double-click the widget file directly from the Widgets directory.</p>
<h3>Step 2: Configuring MAMP</h3>
<p><a href="http://perishablepress.com/wp/wp-content/images/2013/mamp-welcome-full.jpg" title="Click for full-size image"><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/mamp-welcome.jpg" alt="MAMP Start Page" title="After starting Apache, your browser will display the MAMP Start Page, which is located at http://localhost/MAMP/" /></a> Once MAMP is installed, run the program by clicking the &#8220;MAMP.app&#8221; icon from the <code>~/Library/Widgets</code> directory. As MAMP opens, you&#8217;ll be asked &#8220;Do you want the application mysqld to accept incoming network connections?&#8221; Yes, you do want that, so click the &#8220;Allow&#8221; button to proceed.</p>
<p>Next, MAMP will open a browser window and go to the default Start page, located at <code>http://localhost:8888/MAMP/</code>. As seen in the screenshot, the MAMP Start page contains a variety of resources, including a link to phpMyAdmin and your database connection parameters. Along the top of the page, you&#8217;ll find tabs for phpMyAdmin, XCache, and other major components. To create a local server environment, MAMP includes over 20 different programs, including eAccelerator, Zend Optimizer, Freetype, and many more. To see a complete list, visit the &#8220;FAQ&#8221; tab from the Start page.</p>
<p>In addition to the Start page, the application panel should also be visible after starting MAMP. As seen in the screenshot, the MAMP control panel enables you to Start/Stop the servers, Open the Start page, and set your Preferences. Clicking on the &#8220;Preferences&#8221; button brings up an options panel that provides some basic server settings. Let&#8217;s go through each of these settings and optimize our MAMP configuration for WordPress.</p>
<p><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/mamp-options.jpg" alt="Mamp Options Panel" title="The MAMP control panel enables you to Start/Stop the servers, Open the Start page, and set your Preferences." /> <strong>First</strong>, click on the &#8220;Start/Stop&#8221; button and check all of the options, as seen in the screenshot. Also notice that we can set an alternate URL for the MAMP Start page if desired.</p>
<p><strong>Next</strong> we want to change the server ports from MAMP defaults (8888 and 8889) to Apache and MySQL defaults. To do this, click the button that says &#8220;Set to default Apache and MySQL ports&#8221;. This will set the Apache port to 80 and the MySQL port to 3306, which are both standard web-server port numbers.</p>
<p><strong>Lastly</strong>, click on the &#8220;PHP&#8221; button and review the default settings, and then do the same for the Apache settings. For WordPress, the default settings for both of these options panels are going to work fine, so there is no need to change anything for this tutorial. Just know that they&#8217;re there, so if later on you decide to change something, you know where to do so.</p>
<h3>Step 3: See it working</h3>
<p>So MAMP is installed, and you can check functionality by creating a simple <code>index.html</code> file and adding something like <code>&lt;h1&gt;Hello World&lt;/h1&gt;</code>. Then put the file in MAMP&#8217;s <code>/htdocs/</code> directory. Then open a browser tab to <code>http://localhost/</code> to get a basic idea of how MAMP is working. The <code>/htdocs/</code> folder is like the root directory of your local site, and its URL is <code>http://localhost/</code>. We now have all we need to set up WordPress MultiSite.</p>
<h2>Setting up WordPress MultiSite</h2>
<p>With MAMP installed, configured, and ready to go, it&#8217;s time to install WordPress and set up MultiSite. WordPress provides a powerful, flexible framework for building websites, and with its MultiSite functionality, a single installation of the software enables you to create an unlimited number of websites using a single database and one set of files. It&#8217;s really powerful stuff, so learn more and get it for free at <a href="http://wordpress.org/download/">WordPress.org</a>.</p>
<h3>Step 1: Installing WordPress on MAMP</h3>
<p>After downloading the latest version of WordPress, unzip the contents and move them to MAMP&#8217;s <code>/htdocs/</code> folder. After the files have been moved, locate the <code>wp-config-sample.php</code> file in the root directory (htdocs), and rename it to <code>wp-config.php</code>. Then open the file and enter the following database connection settings:</p>
<pre><code>/** The name of the database */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'root');

/** MySQL database password */
define('DB_PASSWORD', 'root');

/** MySQL hostname */
define('DB_HOST', 'localhost');</code></pre>
<p>Once you get the database credentials dialed in, save the file and navigate to the MAMP Home Page in your browser. Click on the &#8220;phpMyAdmin&#8221; tab (near top of page) to open phpMyAdmin, which is basically an user-interface for the MySQL database. On the first page that appears in phpMyAdmin, there&#8217;s a field for creating a new database (see screenshot). Using the default settings, simply type &#8220;wordpress&#8221; in the &#8220;Create new database&#8221; field and click the &#8220;Create&#8221; button to create the database.</p>
<p><a href="http://perishablepress.com/wp/wp-content/images/2013/mamp-database-full.jpg" title="Click for full-size image"><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/mamp-database.jpg" alt="MAMP WP Database" title="Setting up a WordPress database couldn't be easier: just type a name and click the "Create" button." /></a> After the database is created, open a new browser tab to the WordPress installation page at <code>http://localhost/wp-admin/install.php</code>. Here you will specify a Site Title, Username, Password, and Email address. After filling them in, click the &#8220;Install WordPress&#8221; button to install WordPress.</p>
<p>At this point, WordPress is installed and you should see the &#8220;Success!&#8221; message appear on the page. You&#8217;re now ready to set up MultiSite and begin your local website development on MAMP. Click on the &#8220;Log In&#8221; button to log into WordPress to get started with MultiSite.</p>
<h3>Step 2: Setting up MultiSite</h3>
<p>With MAMP and WordPress installed, it&#8217;s time to set up MultiSite, which enables you to create an entire network of sites. As we go, keep in mind that MultiSite is powerful stuff, and there are a LOT of settings and functionality involved. A complete guide to WP MultiSite is beyond the scope of this tutorial, but you can find all the gory details at the official <a href="http://codex.wordpress.org/Create_A_Network">Create a Network page in the Codex</a>. In this part of the tutorial, we cover the basic requirements for setting up and running WordPress MultiSite locally on MAMP.</p>
<p>Begin the set up process by opening your site&#8217;s <code>wp-config.php</code> file from the <code>/htdocs/</code> directory. Here we will define the MultiSite parameters near the bottom of the file. Just above where it says, &#8220;That&#8217;s all, stop editing! Happy blogging&#8221;, add the following line:</p>
<p><code>define('WP_ALLOW_MULTISITE', true);</code></p>
<p><a href="http://perishablepress.com/wp/wp-content/images/2013/mamp-settings-full.jpg" title="Click for full-size image"><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/mamp-settings.jpg" alt="WordPress Create a Network" title="Here we see our Network Details, which should inform you that "sub-directories" are required for added sites." /></a> With that code in place, visit the WordPress Admin and click on the newly added &#8220;Tools &gt; Network&#8221; item. On the &#8220;Create a Network of WordPress Sites&#8221; page, check that everything is filled in correctly and then click the &#8220;Install&#8221; button to create your network of sites.</p>
<blockquote><p>Note: In this tutorial, sub-directories are required for sites added to the network. To use subdomains instead, refer to this guide: <a href="http://perishablepress.com/wordpress-multisite-subdomains-mamp/">WordPress MultiSite Subdomains on MAMP</a>.</p></blockquote>
<p>After clicking the &#8220;Install&#8221; button, the Network page will display the remaining steps required to complete MultiSite installation. For the sake of completeness, we&#8217;ll go through each of these steps and explain a little further about the purpose of each.</p>
<p><a href="http://perishablepress.com/wp/wp-content/images/2013/mamp-network-full.jpg" title="Click for full-size image"><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/mamp-network.jpg" alt="WordPress Enable Network" title="The Network page provides information for setting up your Network, and is always available from the WordPress Admin." /></a> <strong>First</strong> create a directory named <code>blogs.dir</code> in your <code>/wp-content/</code> folder, such that its path looks like <code>/htdocs/wp-content/blogs.dir/</code>. The <code>blogs.dir</code> folder is where WordPress stores uploaded media for your network of sites. This directory must be writeable by the web server.</p>
<p><strong>Next</strong> open your wp-config.php file from the root directory, locate the line that says <code>define('WP_ALLOW_MULTISITE',true);</code>, and place the following code beneath it:</p>
<pre><code>define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
$base = '/';
define('DOMAIN_CURRENT_SITE', 'localhost');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);</code></pre>
<p>These definitions are automatically generated and required for MultiSite to work. Note that a certain amount of customization is possible by tweaking these definitions, should you decide to experiment later on.</p>
<p><strong>Lastly</strong>, create a blank file named <code>.htaccess</code> in your <code>/htdocs/</code> directory and add the following code:</p>
<pre><code>RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule  ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
RewriteRule  ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
RewriteRule . index.php [L]</code></pre>
<p>If somehow you find any existing WordPress rules in your root .htaccess file, replace them with this code (see <a href="http://perishablepress.com/htaccess-code-for-wordpress-multisite/" title="htaccess Code for WordPress Multisite">this post</a> for more details).</p>
<p>Upon completion of these three steps, WordPress MultiSite is enabled and configured. Returning to the Admin Area in the browser, WordPress will require you to log in again. After doing so, click on the new &#8220;Network Admin&#8221; link in the upper-right corner of the screen to create, configure, and manage your Network of sites.</p>
<h2>Next Steps..</h2>
<p>WordPress MultiSite opens the door to endless possibilities, and there&#8217;s a LOT of cool features and functionality that you should explore by simply navigating through the Network Admin area. To create and add a new site to your Network, click on &#8220;Sites &gt; Add New&#8221; menu item and fill in the blanks. To view and manage individual sites, click on the &#8220;Sites &gt; Sites&#8221; menu and hover over any site on the list. As you hover, a variety of options will appear, enabling you to Edit, Deactivate, Archive, Spam, Delete, Visit the site, or go to its Dashboard.</p>
<p>As you develop locally, don&#8217;t forget to keep backups of your work. Using a Mac, you&#8217;re probably covered using Time Machine or similar, but if you ever just want to grab a complete backup of your entire local server, it&#8217;s easily done with a quick copy of your <code>/Applications/MAMP</code> directory.</p>
<h3>Conclusion</h3>
<p>In this tutorial, we&#8217;ve seen how to set up WordPress MultiSite locally on MAMP. Following the steps in this guide, you can create a powerful, flexible developing platform and host all of your sites with a single installation of WordPress.</p>
<p><strong>Note:</strong> This article appears originally in <a href="http://www.netmagazine.com/shop/magazines/october-2011-220">.net Magazine #220</a>. Minor edits have been made concerning software versions and other details.</p>
<p><!--authenticate--></p>
<div class='yarpp-related-rss'>
<p>Related posts:</p><ol>
<li><a href='http://perishablepress.com/wordpress-multisite-subdomains-mamp/' rel='bookmark' title='WordPress MultiSite Subdomains on MAMP'>WordPress MultiSite Subdomains on MAMP</a></li>
<li><a href='http://perishablepress.com/htaccess-code-for-wordpress-multisite/' rel='bookmark' title='htaccess Code for WordPress Multisite'>htaccess Code for WordPress Multisite</a></li>
<li><a href='http://perishablepress.com/run-wordpress-locally/' rel='bookmark' title='Run WordPress Locally with _AMP'>Run WordPress Locally with _AMP</a></li>
</ol>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/perishablepress?a=MqslySaOJwU:W0bnZ-7VD6o:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=MqslySaOJwU:W0bnZ-7VD6o:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=MqslySaOJwU:W0bnZ-7VD6o:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=MqslySaOJwU:W0bnZ-7VD6o:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=MqslySaOJwU:W0bnZ-7VD6o:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=MqslySaOJwU:W0bnZ-7VD6o:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=MqslySaOJwU:W0bnZ-7VD6o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=MqslySaOJwU:W0bnZ-7VD6o:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=bcOpcFrp8Mo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://perishablepress.com/wordpress-multisite-mamp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WP-Mix – A fresh mix of code snippets and tutorials</title>
		<link>http://perishablepress.com/wp-mix-code-snippets-tutorials/</link>
		<comments>http://perishablepress.com/wp-mix-code-snippets-tutorials/#comments</comments>
		<pubDate>Mon, 21 Jan 2013 22:17:42 +0000</pubDate>
		<dc:creator>Jeff Starr</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[snippets]]></category>
		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">http://perishablepress.com/?p=15071</guid>
		<description><![CDATA[Wrapping up 2012, I finally launched xyCSS.com, which is all about responsive, grid-based design. To showcase xy.css, I used it to design WP-Mix.com, which also serves to house a growing collection of choice code snippets. Currently WP-Mix features over 100 snippets, tutorials, and other useful bits to help with WordPress development and web design in general. The topics are similar to those at Perishable Press (e.g., WordPress, PHP, JavaScript, CSS, etc.), but the posts are less-involved and [...]]]></description>
				<content:encoded><![CDATA[<p><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/wpmix_150x150.png" alt="[ WP-Mix ]" style="border:0;padding:0;background-color:transparent;box-shadow:none;" /> Wrapping up <a href="http://perishablepress.com/2012-review/" title="What I did in 2012">2012</a>, I finally launched <a href="http://xycss.com/" title="Responsive Grid Design">xyCSS.com</a>, which is all about responsive, grid-based design. To showcase <code>xy.css</code>, I used it to design <a href="http://wp-mix.com/" title="A fresh mix of code snippets and tutorials">WP-Mix.com</a>, which also serves to house a growing collection of choice code snippets. Currently WP-Mix features over 100 snippets, tutorials, and other useful bits to help with WordPress development and web design in general. The topics are similar to those at <a href="http://perishablepress.com/">Perishable Press</a> (e.g., WordPress, PHP, JavaScript, CSS, etc.), but the posts are less-involved and aimed at intermediate to advanced developers.</p>
<p><span id="more-15071"></span></p>
<h3>About the site</h3>
<p>As mentioned, <a href="http://wp-mix.com/" title="A fresh mix of code snippets and tutorials">WP-Mix.com</a> is focused on two things: showcasing responsive, grid-based design, and sharing as many juicy code snippets and design techniques as possible. While visiting the site, you can see the liquid grid in action by clicking the &#8220;show matrix&#8221; button at the top of the page.</p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/wpmix-01.jpg" alt="[ WP-Mix - Design Display ]" /><br /><small><em>Default UX view &#8212; click the &#8220;show matrix&#8221; button to view the liquid grid.</em></small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/wpmix-02.jpg" alt="[ WP-Mix - Matrix Display ]" /><br /><small><em>xy-grid view &#8212; click the &#8220;hide matrix&#8221; button to return to default UX view.</em></small></p>
<h3>Details</h3>
<p>Here are some interesting tidbits about the site:</p>
<p><a href="http://wp-mix.com/" title="A fresh mix of code snippets and tutorials">WP-Mix.com</a> is built with <a href="http://wordpress.org/">WordPress</a> and <a href="http://xycss.com/" title="Responsive Grid Design">xy.css</a>. Everything is kept as clean and minimal as possible, with only a handful of required plugins:</p>
<ul>
<li><a href="http://wordpress.org/extend/plugins/crayon-syntax-highlighter/">Crayon Syntax Highlighter</a> &#8212; syntax highlighting*</li>
<li><a href="http://wordpress.org/extend/plugins/simple-feed-stats/">Simple Feed Stats</a> &#8212; easy feed stats (without Feedburner)</li>
<li><a href="http://wordpress.org/extend/plugins/simple-basic-contact-form/">Simple Basic Contact Form</a> &#8212; clean, simple contact form</li>
<li><a href="http://wordpress.org/extend/plugins/simple-local-avatars/">Simple Local Avatars</a> &#8212; custom local avatars</li>
<li><a href="http://wordpress.org/extend/plugins/wp-db-backup/">WordPress Database Backup</a> &#8212; quick and easy database backups</li>
</ul>
<p>Here are a few more notable moves to further streamline WP-Mix for better <abbr title="Search Engine Optimization">SEO</abbr>, usability, and maintainability:</p>
<ul>
<li>Comments are disabled &#8212; this greatly simplifies everything</li>
<li>Tag and author archives are disabled &#8212; focuses activity on content pages</li>
<li>Clean search <abbr title="Uniform Resource Locators">URL</abbr>s &#8212; replaced query-string with permalink style URLs</li>
<li>Clear navigation &#8212; hyperlinks are underlined, perpetual post navigation, etc.</li>
<li>Distraction-free &#8212; everything is focused on the content</li>
<li>Built with <code>xy.css</code> &#8212; for responsive, liquid-grid design</li>
</ul>
<p>* Note about the Crayon plugin: it produces some great looking code, but requires <em>way too many HTTP requests</em> to do the job. The plugin makes <strong>15</strong> <abbr title="Hypertext Transfer Protocol">HTTP</abbr> requests for syntax highlighting (even on the home page where it&#8217;s not needed).</p>
<h3>Screenshots</h3>
<p>Here are some representative screenshots for WP-Mix:</p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/wpmix-04.jpg" alt="[ WP-Mix ]" /><br /><small><em>Squeaky clean, content-focused design</em></small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/wpmix-05.jpg" alt="[ WP-Mix - Syntax Highlighted Code ]" /><br /><small><em>Syntax-highlighting for all code snippets</em></small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/wpmix-03.jpg" alt="[ WP-Mix - Footer Toolbar ]" /><br /><small><em>Streamlined toolbar contains only the essentials</em></small></p>
<h3>Plans</h3>
<p>Going forward, I&#8217;ll be posting as many useful/interesting code snippets as possible. I think it&#8217;s much better to share snippets than to let them whither in the archives. Plus, posting and organizing the content online makes them available from any location, which is nice when I&#8217;m working out of the office.</p>
<p>Other plans for the site include possibly opening it up to registration and <a href="http://perishablepress.com/user-submitted-posts/">user-submitted posts</a>, so that other enthusiasts can share their snippets as well.</p>
<p>So that&#8217;s it for now, I hope you enjoy the new site, responsive grid design, and all the code snippets. If you enjoy the site, you can <a href="http://wp-mix.com/feed/">grab the feed</a> for free updates delivered fresh. Tweets also appreciated :)</p>
<p><!--authenticate--></p>
<div class='yarpp-related-rss'>
<p>Related posts:</p><ol>
<li><a href='http://perishablepress.com/xycss-responsive-grid-design/' rel='bookmark' title='New Site: xyCSS.com &#8211; Responsive Grid Design'>New Site: xyCSS.com &#8211; Responsive Grid Design</a></li>
<li><a href='http://perishablepress.com/misc-code-snippets-wordpress/' rel='bookmark' title='Miscellaneous Code Snippets for WordPress, Windows, and Firefox'>Miscellaneous Code Snippets for WordPress, Windows, and Firefox</a></li>
<li><a href='http://perishablepress.com/code-snippets/' rel='bookmark' title='Huge Collection of Code Snippets: HTAccess, PHP, WordPress, jQuery, HTML, CSS'>Huge Collection of Code Snippets: HTAccess, PHP, WordPress, jQuery, HTML, CSS</a></li>
</ol>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/perishablepress?a=OL3s-TOn3f8:L5egywDlpVA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=OL3s-TOn3f8:L5egywDlpVA:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=OL3s-TOn3f8:L5egywDlpVA:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=OL3s-TOn3f8:L5egywDlpVA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=OL3s-TOn3f8:L5egywDlpVA:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=OL3s-TOn3f8:L5egywDlpVA:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=OL3s-TOn3f8:L5egywDlpVA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=OL3s-TOn3f8:L5egywDlpVA:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=bcOpcFrp8Mo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://perishablepress.com/wp-mix-code-snippets-tutorials/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>New Site: xyCSS.com – Responsive Grid Design</title>
		<link>http://perishablepress.com/xycss-responsive-grid-design/</link>
		<comments>http://perishablepress.com/xycss-responsive-grid-design/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 01:41:34 +0000</pubDate>
		<dc:creator>Jeff Starr</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">http://perishablepress.com/?p=15070</guid>
		<description><![CDATA[For the past year or so, I&#8217;ve been heavy into responsive, grid-based design. In December, I &#8220;soft-launched&#8221; my new site, xyCSS.com with a simple tweet: Bringing it all together: http://xycss.com/ As implied (and explained), xy.css is a lightweight CSS template for creating semantic HTML5 designs on a responsive liquid matrix. At its core, xy.css neutralizes rogue browser styles, combines horizontal and vertical grids, and provides a flexible template for responsive design. From there, xy.css facilitates clean, device-neutral [...]]]></description>
				<content:encoded><![CDATA[<p><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/xycss_100x100.png" alt="[ xyCSS ]" /> For the past year or so, I&#8217;ve been heavy into responsive, grid-based design. In December, I &#8220;soft-launched&#8221; my new site, <a href="http://xycss.com/">xyCSS.com</a> with a <a href="https://twitter.com/perishable/status/284085181084745728">simple tweet</a>:</p>
<blockquote><p>Bringing it all together: http://xycss.com/</p></blockquote>
<p>As implied (and <a href="http://xycss.com/xy/" title="xy.css : responsive liquid matrix">explained</a>), <code>xy.css</code> is a lightweight <abbr title="Cascading Style Sheets">CSS</abbr> template for creating semantic <abbr title="Hypertext Markup Language - 5th Revision">HTML5</abbr> designs on a <strong>responsive liquid matrix</strong>. </p>
<p><span id="more-15070"></span></p>
<p>At its core, <code>xy.css</code> neutralizes rogue browser styles, <em>combines horizontal and vertical grids</em>, and provides a flexible template for <em>responsive design</em>. From there, <code>xy.css</code> facilitates clean, device-neutral designs with a complete set of <a href="http://xycss.com/xy/demos/liquid-matrix/" title="Demo: Visual xy.css matrix via preset classes">preset classes</a> for easy layouts via grid-based columns and rows.</p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/xycss-01.jpg" alt="[ xyCSS.com - Homepage ]" /><br /><small><em>My new baby has eight circular and symmetrically positioned heads</em></small></p>
<h3>Features</h3>
<p><code>xy.css</code> brings together the best CSS techniques from around the Web and integrates them into a single, powerful stylesheet template. As showcased on the home page:</p>
<ul>
<li><a href="http://xycss.com/features/liquid-layout/">Liquid layout</a></li>
<li><a href="http://xycss.com/features/vertical-grid/">Vertical grid</a></li>
<li><a href="http://xycss.com/features/horizontal-grid/">Horizontal grid</a></li>
<li><a href="http://xycss.com/features/responsive-design/">Responsive design</a></li>
<li><a href="http://xycss.com/features/progressive-enhancement/">Progressive enhancement</a></li>
<li><a href="http://xycss.com/features/custom-fonts/">Custom fonts</a></li>
<li><a href="http://xycss.com/features/semantic-markup/">Semantic markup</a></li>
<li><a href="http://xycss.com/features/universal-support/">Universal support</a></li>
</ul>
<p>These key techniques coalesce in <a href="http://xycss.com/">xy.css</a>, providing the control, flexibility, and consistency required for responsive, grid-based design. To see some examples, check out the <a href="http://xycss.com/xy/demos/">Demos</a>.</p>
<p>So that&#8217;s it in a nutshell: <code>xy.css</code> is a CSS template for responsive grid-based design. It&#8217;s all open source and very much a work in progress. The plan is to bring a few like-minded individuals on board and take it to the next level. <a href="http://perishablepress.com/contact/">Drop a line</a> to learn more.</p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/xycss-03.jpg" alt="[ xyCSS.com - Custom fonts ]" /><br /><small><em>Custom fonts displayed on the vertical grid</em></small></p>
<h3>About the site</h3>
<p>The site itself &#8212; <a href="http://xycss.com/">xyCSS.com</a> &#8212; is built with WordPress, HTML5, CSS3 and of course <code>xy.css</code>. To help visualize the responsive, grid-based design, the site includes numerous on-page tools:</p>
<ul>
<li><strong>Upper-left corner</strong> &ndash; displays the current browser width</li>
<li><strong>Upper-right corner</strong> &ndash; buttons for showing/hiding the grid</li>
<li><strong>Lower-left corner</strong> &ndash; displays the current <code>@media</code> rules</li>
<li><strong>Upper-right corner</strong> &ndash; &ldquo;Top&rdquo; button</li>
</ul>
<p>To view the vertical grid, click the &ldquo;show matrix&rdquo; button. To see the horizontal grid, resize the browser width to <strong>984px</strong> and click the &ldquo;layout grid&rdquo; button. Visit <a href="http://xycss.com/xy/tools/">Tools</a> to implement any of these diagnostic techniques on your own web pages.</p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/xycss-02.jpg" alt="[ xyCSS.com - Visual Grid ]" /><br /><small><em>Visualize the xy matrix for any page on the site by clicking the &#8220;show/hide matrix&#8221; button</em></small></p>
<h3>Responsiveness</h3>
<p>Here are some additional screenshots demonstrating the <em>responsiveness</em> of xyCSS.com.</p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/xycss-05.jpg" alt="[ xyCSS.com - Responsive design ]" /><br /><small><em>For large screens, the main menu is positioned on the right side of the content</em></small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/xycss-06.jpg" alt="[ xyCSS.com - Responsive design ]" /><br /><small><em>As screen width decreases, the menu items rotate 90 degrees to optimize space</em></small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/xycss-07.jpg" alt="[ xyCSS.com - Responsive design ]" /><br /><small><em>For smaller screens, the menu slides to the top of the page to further optimize space</em></small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/xycss-08.jpg" alt="[ xyCSS.com - Responsive design ]" /><br /><small><em>For increasingly smaller screen sizes, the menu items begin to &#8220;squish&#8221; together, which is fun to watch</em></small></p>
<p>And of course all of this responsiveness is perfectly aligned with the liquid matrix (horizontal and vertical grid). Here&#8217;s one more for the road..</p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2013/xycss-04.jpg" alt="[ xyCSS.com - small screen display ]" /><br /><small><em>The eight circles on the xyCSS homepage collapse into menu items for smaller screens</em></small></p>
<p><a href="http://xycss.com/" title="xyCSS - responsive grid design">Visit the site</a> to learn about and see more responsive, grid-based action!</p>
<h3>Learn more..</h3>
<p>Check out these links to learn more about <code>xy.css</code>:</p>
<ul>
<li><a href="http://xycss.com/about/">About the site</a></li>
<li><a href="http://xycss.com/blog/">xyCSS Blog</a></li>
<li><a href="http://xycss.com/xy/docs/">Documentation</a></li>
<li><a href="http://xycss.com/xy/demos/">Demos</a></li>
<li><a href="http://xycss.com/xy/tools/">Tools</a></li>
<li><a href="http://xycss.com/xy/downloads/">Downloads</a></li>
</ul>
<p>I&#8217;ve also designed my new site with <code>xy.css</code> &#8212; check out <a href="http://wp-mix.com/">WP-Mix.com</a> for a fresh mix of code snippets and tutorials, delivered via responsive liquid grid. <a href="http://perishablepress.com/wp-mix-code-snippets-tutorials/">Learn more about WP-Mix</a>!</p>
<p>Thanks for reading! :)</p>
<p><!--authenticate--></p>
<div class='yarpp-related-rss'>
<p>Related posts:</p><ol>
<li><a href='http://perishablepress.com/minimalist-web-design-examples/' rel='bookmark' title='15+ Collections of Minimalist Web Design'>15+ Collections of Minimalist Web Design</a></li>
<li><a href='http://perishablepress.com/about/' rel='bookmark' title='About Perishable Press'>About Perishable Press</a></li>
<li><a href='http://perishablepress.com/css3-progressive-enhancement-smart-design/' rel='bookmark' title='CSS3 + Progressive Enhancement = Smart Design'>CSS3 + Progressive Enhancement = Smart Design</a></li>
</ol>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/perishablepress?a=bG6hCp0WdF0:uFeQdpAE2vE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=bG6hCp0WdF0:uFeQdpAE2vE:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=bG6hCp0WdF0:uFeQdpAE2vE:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=bG6hCp0WdF0:uFeQdpAE2vE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=bG6hCp0WdF0:uFeQdpAE2vE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=bG6hCp0WdF0:uFeQdpAE2vE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=bG6hCp0WdF0:uFeQdpAE2vE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=bG6hCp0WdF0:uFeQdpAE2vE:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=bcOpcFrp8Mo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://perishablepress.com/xycss-responsive-grid-design/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>5G Blacklist 2013</title>
		<link>http://perishablepress.com/5g-blacklist-2013/</link>
		<comments>http://perishablepress.com/5g-blacklist-2013/#comments</comments>
		<pubDate>Thu, 10 Jan 2013 07:55:00 +0000</pubDate>
		<dc:creator>Jeff Starr</dc:creator>
				<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[blacklist]]></category>
		<category><![CDATA[firewall]]></category>

		<guid isPermaLink="false">http://perishablepress.com/?p=15067</guid>
		<description><![CDATA[Following up on much feedback (and this post), here is an update for the 5G Blacklist for 2013. As explained in the 2012 article (and elsewhere), the 5G Blacklist helps reduce the number of malicious URL requests that hit your website. It&#8217;s one of many ways to improve the security of your site and protect against evil exploits, bad requests, and other nefarious garbage. If your site runs on Apache and you&#8217;re familiar with .htaccess, the 5G [...]]]></description>
				<content:encoded><![CDATA[<p><img class="l" src="http://perishablepress.com/wp/wp-content/images/2013/5G-Blacklist.gif" alt="[ 5G (2013) ]" /> Following up on <a href="http://perishablepress.com/5g-blacklist-2012/#comments">much feedback</a> (and <a href="http://perishablepress.com/stop-using-unsafe-characters-in-urls/" title="(Please) Stop Using Unsafe Characters in URLs">this post</a>), here is an update for the <a href="http://perishablepress.com/5g-blacklist-2012/">5G Blacklist</a> for <strong>2013</strong>. As explained in the 2012 article (and <a href="http://perishablepress.com/tag/blacklist/" title="Tag Archive for 'blacklist'">elsewhere</a>), the <abbr title="5th Generation">5G</abbr> Blacklist helps reduce the number of malicious <abbr title="Uniform Resource Locator">URL</abbr> requests that hit your website. It&#8217;s one of many ways to improve the <a href="http://perishablepress.com/category/web-design/security/">security</a> of your site and protect against evil exploits, bad requests, and other nefarious garbage. If your site runs on Apache and you&#8217;re familiar with <a href="http://htaccessbook.com/" title=".htaccess made easy">.htaccess</a>, the 5G is an effective way to secure your site against malicious <abbr title="Hypertext Transfer Protocol">HTTP</abbr> activity.</p>
<p><span id="more-15067"></span></p>
<h3 id="about-5G">About the 5G Blacklist</h3>
<p>The 5G Blacklist is a simple, flexible blacklist that checks all URI requests against a series of carefully constructed <abbr title="Hypertext Access">HTAccess</abbr> directives. This happens quietly behind the scenes at the server level, saving resources for stuff like <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> and <abbr title="My Structured Query Language">MySQL</abbr> for all blocked requests.</p>
<h3 id="description">How it works</h3>
<p>Blacklists can <a href="http://perishablepress.com/eight-ways-to-blacklist-with-apaches-mod_rewrite/" title="Eight Ways to Blacklist with Apache’s mod_rewrite">block just about any part of a request</a>: <abbr title="Internet Protocol">IP</abbr>, user agent, request string, query string, referrer, and everything in between. But IP addresses change constantly, and user agents and referrers are easily spoofed. As <a href="http://perishablepress.com/building-the-3g-blacklist-part-1/" title="Improving Site Security by Recognizing and Exploiting Server Attack Patterns">discussed</a>, request strings yield the best results: greater protection with fewer false positives.</p>
<p>The 5G works beautifully with WordPress, and should help <em>any</em> site conserve bandwidth and server resources while protecting against <a href="http://perishablepress.com/malicious-server-scans/" title="What a Malicious Server Scan Looks Like">malicious activity</a>.</p>
<h3 id="blacklist">5G Blacklist 2013</h3>
<p>Here is the <em>third version</em> of the <strong>5th generation blacklist</strong>:</p>
<pre><code># 5G BLACKLIST/FIREWALL (2013)
# @ http://perishablepress.com/5g-blacklist-2013/

# 5G:[QUERY STRINGS]
&lt;IfModule mod_rewrite.c&gt;
	RewriteEngine On
	RewriteBase /
	RewriteCond %{QUERY_STRING} (\"|%22).*(&lt;|&gt;|%3) [NC,OR]
	RewriteCond %{QUERY_STRING} (javascript:).*(\;) [NC,OR]
	RewriteCond %{QUERY_STRING} (&lt;|%3C).*script.*(&gt;|%3) [NC,OR]
	RewriteCond %{QUERY_STRING} (\\|\.\./|`|=\'$|=%27$) [NC,OR]
	RewriteCond %{QUERY_STRING} (\;|\'|\"|%22).*(union|select|insert|drop|update|md5|benchmark|or|and|if) [NC,OR]
	RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig) [NC,OR]
	RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR]
	RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC]
	RewriteRule .* - [F]
&lt;/IfModule&gt;

# 5G:[USER AGENTS]
&lt;IfModule mod_setenvif.c&gt;
	# SetEnvIfNoCase User-Agent ^$ keep_out
	SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) keep_out
	&lt;limit GET POST PUT&gt;
		Order Allow,Deny
		Allow from all
		Deny from env=keep_out
	&lt;/limit&gt;
&lt;/IfModule&gt;

# 5G:[REQUEST STRINGS]
&lt;IfModule mod_alias.c&gt;
	RedirectMatch 403 (https?|ftp|php)\://
	RedirectMatch 403 /(https?|ima|ucp)/
	RedirectMatch 403 /(Permanent|Better)$
	RedirectMatch 403 (\=\\\'|\=\\%27|/\\\'/?|\)\.css\()$
	RedirectMatch 403 (\,|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\||\\\"\\\")
	RedirectMatch 403 \.(cgi|asp|aspx|cfg|dll|exe|jsp|mdb|sql|ini|rar)$
	RedirectMatch 403 /(contac|fpw|install|pingserver|register)\.php$
	RedirectMatch 403 (base64|crossdomain|localhost|wwwroot|e107\_)
	RedirectMatch 403 (eval\(|\_vti\_|\(null\)|echo.*kae|config\.xml)
	RedirectMatch 403 \.well\-known/host\-meta
	RedirectMatch 403 /function\.array\-rand
	RedirectMatch 403 \)\;\$\(this\)\.html\(
	RedirectMatch 403 proc/self/environ
	RedirectMatch 403 msnbot\.htm\)\.\_
	RedirectMatch 403 /ref\.outcontrol
	RedirectMatch 403 com\_cropimage
	RedirectMatch 403 indonesia\.htm
	RedirectMatch 403 \{\$itemURL\}
	RedirectMatch 403 function\(\)
	RedirectMatch 403 labels\.rdf
	RedirectMatch 403 /playing.php
	RedirectMatch 403 muieblackcat
&lt;/IfModule&gt;

# 5G:[REQUEST METHOD]
&lt;ifModule mod_rewrite.c&gt;
	RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
	RewriteRule .* - [F]
&lt;/IfModule&gt;

# 5G:[BAD IPS]
&lt;limit GET POST PUT&gt;
	Order Allow,Deny
	Allow from all
	# uncomment/edit/repeat next line to block IPs
	# Deny from 123.456.789
&lt;/limit&gt;</code></pre>
<p><strong>To use:</strong> include the entire 5G Blacklist in the root .htaccess file of your site. Remember to backup your original .htaccess file before making any changes. Test thoroughly while enjoying your favorite beverage. If you encounter any issues, please read the <a href="#troubleshooting" class="anchor">troubleshooting tips</a> and/or <a href="#comment" class="anchor">leave a comment</a> to report a bug.</p>
<p><strong>Note:</strong> in some cases it may be necessary to place the QUERY STRING rules <em>before</em> WP-permalink rules.</p>
<h3 id="pre-changelog">Pre-changelog notes</h3>
<p>The changes made for <a href="http://perishablepress.com/5g-blacklist-2013/">5G 2013</a> are aimed at maximizing compatibility. Unfortunately, a number of required changes are due to improper coding and ignoring HTTP specifications. As mentioned previously, <a href="http://perishablepress.com/stop-using-unsafe-characters-in-urls/" title="(Please) Stop Using Unsafe Characters in URLs">using unsafe characters in URLs</a> <em>obsoletes security measures</em> that are based on pattern-matching, which is <em>integral</em> to the process of blocking malicious activity.</p>
<p>To illustrate, it is possible to protect against a <em>wide range</em> of malicious requests by blocking unsafe characters such as unencoded question marks &ldquo;<code>?</code>&rdquo; included <em>within</em> the query string. Firewalls, blacklists, security plugins and scripts are able to safely block such bad requests UNTIL some widely used service such as <em>Google Adwords</em> decides to start including multiple unencoded question marks in their query strings. Suddenly blocking potentially dangerous &ldquo;<code>?</code>&rdquo; requests is useless because nobody wants to block legitimate (Google) traffic.</p>
<p>Moral of the story: if you develop for the Web, contribute to its security by encoding your URLs according to spec. If you use security plugins, firewalls/blackists, and scripts that rely on pattern-matching to protect your site, please encourage and educate others about the importance of adhering to <abbr title="Hypertext Transfer Protocol">HTTP</abbr> specifications.<code>&lt;/rant&gt;</code></p>
<h3 id="changelog">Changelog</h3>
<p><strong>Removed from QUERY STRINGS</strong></p>
<ul>
<li>Square brackets &ldquo;<code>[</code>&rdquo; and &ldquo;<code>]</code>&rdquo; (<a href="http://perishablepress.com/stop-using-unsafe-characters-in-urls/#wp-unsafe-characters">details</a>)</li>
<li>Colon &ldquo;<code>:</code>&rdquo; (<a href="http://perishablepress.com/stop-using-unsafe-characters-in-urls/#google-unsafe-characters">details</a>)</li>
<li>Unencoded question mark &ldquo;<code>\?</code>&rdquo; (WP&#8217;s preview feature, Piwik, Adwords, et al)</li>
<li>Removed &ldquo;<code>(menu|mod|path|tag)\=\.?/?</code>&rdquo; (WP menus, WP Super Cache, Joomla, Googlebot, et al)</li>
<li>Removed &ldquo;<code>environ</code>&rdquo; (common string)</li>
<li>Removed &ldquo;<code>scanner</code>&rdquo; (various WP plugins)</li>
<li>Removed &ldquo;<code>%3E</code>&rdquo; (common string)</li>
<li>Escaped backslash, from &ldquo;<code>\</code>&rdquo; to &ldquo;<code>\\</code>&rdquo;</li>
</ul>
<p><strong>Removed from USER AGENTS</strong></p>
<ul>
<li>Commented out match for blank/empty user-agent &ldquo;<code>^$</code>&rdquo; (PayPal, WP-Piwik, et al)</li>
<li>Removed match for &ldquo;<code>libwww</code>&rdquo; (used by Lynx browser)</li>
</ul>
<p><strong>Removed from REQUEST STRINGS</strong></p>
<ul>
<li>Double forward slash &ldquo;<code>//</code>&rdquo; (Pingdom, gtmetrix, et al)</li>
<li>Removed match for &ldquo;<code>/cgi/</code>&rdquo; (Fancy indexes, Authentication)</li>
</ul>
<p><strong>Added to QUERY STRINGS (5G 2013)</strong></p>
<ul>
<li>&ldquo;<code>TRACE</code>&rdquo; and &ldquo;<code>TRACK</code>&rdquo;</li>
<li>&ldquo;<code>base64_encode.*\(</code>&rdquo;</li>
<li>&ldquo;<code>\|%3E</code>&rdquo;</li>
<li>&ldquo;<code>GLOBALS(=|\[|\%)</code>&rdquo;</li>
<li>&ldquo;<code>REQUEST(=|\[|\%)</code>&rdquo;</li>
<li>&ldquo;<code>`</code>&rdquo;</li>
<li>&ldquo;<code>(\"|%22).*(&lt;|&gt;|%3)</code>&rdquo;</li>
<li>&ldquo;<code>(&lt;|%3C).*script.*(&gt;|%3)</code>&rdquo;</li>
<li>&ldquo;<code>(javascript:).*(\;)</code>&rdquo;</li>
<li>&ldquo;<code>(\;|\'|\"|%22).*(union|select|insert|drop|update|md5|benchmark|or|and|if)</code>&rdquo;</li>
</ul>
<p><strong>Other changes</strong></p>
<p>Optimized syntax, improved formatting.</p>
<h3 id="troubleshooting">Troubleshooting</h3>
<p>If there is an error, remove the code and make a backup of your original .htaccess file (if you haven&#8217;t already done so). Investigate the <abbr title="Uniform Resource Locator">URL</abbr> for whichever page is blocked or not working, making note of any non-alphanumeric characters or anything else that looks unusual. With a good idea of what to look for, examine the 5G directives to see if anything looks similar. If so, try removing (or commenting out) the offending line (or characters) and see if that resolves the issue. </p>
<p>If that doesn&#8217;t work, further investigation is required, and there are numerous ways of going about it. Here is a good <a href="http://www.wpsecuritychecklist.com/the-perishable-press-halving-method/">walkthrough</a> of my <a href="http://perishablepress.com/the-halving-method-of-identifying-problematic-code/">halving method</a> of isolating problematic code, which I recommend unless you have your own favorite way of troubleshooting ;)</p>
<h3 id="support">Show support</h3>
<p>If you benefit from my work with the 5G and would like to show support, consider buying a copy of my book, <a href="http://htaccessbook.com/">.htaccess made easy</a>. You&#8217;ll get a complete guide to .htaccess, exclusive forum access, and a ton of awesome techniques for configuring, optimizing, and securing your site. Your generous support allows me to continue developing 5G/6G and other awesome resources for the community. Thank you!</p>
<h3 id="disclaimer">Disclaimer</h3>
<p>The 5G Firewall is provided &ldquo;as-is&rdquo;, with the intention of helping site administrators protect their sites against bad requests and other malicious activity. The code is open and free to use and modify as long as the first two credit lines remain intact. By using this code you assume all risk &amp; responsibility for anything that happens, whether good or bad. In short, use wisely, test thoroughly, don&rsquo;t sue me.</p>
<h3 id="learn-more">Learn more..</h3>
<p>To learn more about the theory and development of the 5G Firewall, check out my articles on <a href="http://perishablepress.com/series-summary-building-the-3g-blacklist/">building the 3G</a>, <a href="http://perishablepress.com/building-the-perishable-press-4g-blacklist/" title="Building the Perishable Press 4G Blacklist">4G</a> and <a href="http://perishablepress.com/building-the-5g-blacklist/" title="Building the 5G Blacklist">5G Blacklist</a>. The <a href="http://perishablepress.com/6g-beta/">6G beta</a> article also contains some good information. And if all that&#8217;s not enough, a quick search for &ldquo;blacklist&rdquo; in the sidebar should also yield <strong>many</strong> results.</p>
<p><!--authenticate--></p>
<div class='yarpp-related-rss'>
<p>Related posts:</p><ol>
<li><a href='http://perishablepress.com/5g-blacklist-2012/' rel='bookmark' title='5G Blacklist 2012'>5G Blacklist 2012</a></li>
<li><a href='http://perishablepress.com/5g-firewall-beta/' rel='bookmark' title='5G Firewall Beta'>5G Firewall Beta</a></li>
<li><a href='http://perishablepress.com/wordpress-5g-blacklist/' rel='bookmark' title='WordPress Add-on for 5G Blacklist'>WordPress Add-on for 5G Blacklist</a></li>
</ol>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/perishablepress?a=Q4Jd-UdeyZo:1Uo8NR9XWoE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=Q4Jd-UdeyZo:1Uo8NR9XWoE:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=Q4Jd-UdeyZo:1Uo8NR9XWoE:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=Q4Jd-UdeyZo:1Uo8NR9XWoE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=Q4Jd-UdeyZo:1Uo8NR9XWoE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=Q4Jd-UdeyZo:1Uo8NR9XWoE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=Q4Jd-UdeyZo:1Uo8NR9XWoE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=Q4Jd-UdeyZo:1Uo8NR9XWoE:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=bcOpcFrp8Mo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://perishablepress.com/5g-blacklist-2013/feed/</wfw:commentRss>
		<slash:comments>86</slash:comments>
		</item>
		<item>
		<title>Introspection WordPress Theme</title>
		<link>http://perishablepress.com/introspection-wordpress-theme/</link>
		<comments>http://perishablepress.com/introspection-wordpress-theme/#comments</comments>
		<pubDate>Wed, 09 Jan 2013 03:23:47 +0000</pubDate>
		<dc:creator>Jeff Starr</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[downloads]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[themes]]></category>

		<guid isPermaLink="false">http://perishablepress.com/?p=15065</guid>
		<description><![CDATA[Free WordPress theme! The dark/minimalist design of the Introspection theme was originally created for a Pink Floyd fan site. After taking the site down to clear room (and time) for new stuff, I felt the design was too sweet to just let rot away in the archives. So after a few days of generalizing Introspection for public use, I&#8217;ve made it freely available for download so it can shine on.. Introspection (click image for full-size view) Introspection [...]]]></description>
				<content:encoded><![CDATA[<p>Free WordPress theme! The dark/minimalist design of the <a href="http://perishablepress.com/introspection-wordpress-theme/">Introspection theme</a> was originally created for a Pink Floyd fan site. After taking the site down to clear room (and time) for <a href="http://xycss.com/" title="Responsive liquid matrix design">new stuff</a>, I felt the design was <em>too sweet</em> to just let rot away in the archives. So after a few days of generalizing <em>Introspection</em> for public use, I&#8217;ve made it freely available for download so it can <em>shine on</em>..</p>
<p><span id="more-15065"></span></p>
<p><a href="http://perishablepress.com/wp/wp-content/images/2006/perish-themes/2013_introspection_.gif" title="Introspection Screenshot (via Chrome)"><img src="http://perishablepress.com/wp/wp-content/images/2006/perish-themes/2013_introspection.jpg" alt="Introspection" /></a><br /><small>Introspection (click image for full-size view)</small></p>
<blockquote><p>Introspection is a clean, simple theme designed to streamline workflow, optimize content, and inspire productivity.</p></blockquote>
<h3>Features</h3>
<ul class="refs">
<li>Minimalistic, lightweight, optimized design</li>
<li>Supports custom menus, widgets, and featured images</li>
<li>HTML5/CSS3 design with browser-safe colors and fonts</li>
<li>Traditional two-column, fixed-width design</li>
<li><a href="http://wp-mix.com/tabbed-sidebar-menu-jquery/">Tabbed sidebar menu</a> showing recent, popular, and random posts</li>
<li>All-standard, plug-n-play WP theme functionality</li>
</ul>
<p>The thing I like about <em>Introspection</em> is that it&#8217;s simple, clean and focused on content. It&#8217;s designed with greyscale color palette, consistent typography, and a well-balanced layout. When using this theme, I literally feel like creating content just to see how it will look &#8220;on the page.&#8221; Plus the theme&#8217;s source code is lightweight and flexible &#8212; perfect for intermediate users who want to customize their own introspective theme.</p>
<h3 id="theme-demo">Demo</h3>
<p><a href="http://bluefeed.net/wordpress/" title="Introspection theme Demo at Bluefeed.net">Introspection Demo</a></p>
<h3 id="theme-download">Download</h3>
<p><p><strong class="download"><a href="http://perishablepress.com/wp/wp-content/plugins/download-monitor/download.php?id=55" title="Downloaded 470 times">WP Theme - Introspection - version 20130108 - 254KB ZIP</a></strong></p></p>
<p><strong>Note:</strong> <em>Introspection is also available from my <a href="http://perishablepress.com/perishable-wordpress-themes/">WordPress themes</a> page.</em></p>
<p><!--authenticate--></p>
<div class='yarpp-related-rss'>
<p>Related posts:</p><ol>
<li><a href='http://perishablepress.com/perishable-wordpress-themes/' rel='bookmark' title='WordPress Themes'>WordPress Themes</a></li>
<li><a href='http://perishablepress.com/minimalist-theme/' rel='bookmark' title='minimalist Theme'>minimalist Theme</a></li>
<li><a href='http://perishablepress.com/dos-fx-theme/' rel='bookmark' title='DOS_FX Theme'>DOS_FX Theme</a></li>
</ol>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/perishablepress?a=W3NNsF6RwMs:kooKxR4agzE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=W3NNsF6RwMs:kooKxR4agzE:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=W3NNsF6RwMs:kooKxR4agzE:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=W3NNsF6RwMs:kooKxR4agzE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=W3NNsF6RwMs:kooKxR4agzE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=W3NNsF6RwMs:kooKxR4agzE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=W3NNsF6RwMs:kooKxR4agzE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=W3NNsF6RwMs:kooKxR4agzE:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=bcOpcFrp8Mo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://perishablepress.com/introspection-wordpress-theme/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Protection for WordPress Pingback Vulnerability</title>
		<link>http://perishablepress.com/wordpress-xmlrpc-pingback-vulnerability/</link>
		<comments>http://perishablepress.com/wordpress-xmlrpc-pingback-vulnerability/#comments</comments>
		<pubDate>Thu, 03 Jan 2013 07:52:37 +0000</pubDate>
		<dc:creator>Jeff Starr</dc:creator>
				<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[pingbacks]]></category>

		<guid isPermaLink="false">http://perishablepress.com/?p=15059</guid>
		<description><![CDATA[It was recently reported about a WordPress Pingback Vulnerability, whereby an attacker has four potential ways to cause harm via xmlrpc.php, which is the file included in WordPress for XML-RPC Support (e.g., &#8220;pingbacks&#8221;). In this post, I offer a simple .htaccess technique to lock things down and protect against any meddling via the xmlrpc.php file. Note: this technique is only recommended if you aren&#8217;t using XML-RPC for anything (e.g., pingbacks, Blogger, MovableType, etc.). Update: Check out the [...]]]></description>
				<content:encoded><![CDATA[<p>It was recently reported about a <a href="http://www.acunetix.com/blog/web-security-zone/wordpress-pingback-vulnerability/">WordPress Pingback Vulnerability</a>, whereby an attacker has four potential ways to cause harm via <code>xmlrpc.php</code>, which is the file included in WordPress for <a href="http://codex.wordpress.org/XML-RPC_Support">XML-RPC Support</a> (e.g., &#8220;pingbacks&#8221;). In this post, I offer a simple .htaccess technique to lock things down and protect against any meddling via the <code>xmlrpc.php</code> file. Note: this technique is only recommended if you <em>aren&#8217;t</em> using <abbr title="eXtensible Markup Language - Remote Procedure Call">XML-RPC</abbr> for anything (e.g., pingbacks, Blogger, MovableType, etc.). <strong>Update:</strong> Check out the <a href="#alt-method" class="anchor">alternate method</a> to whitelist specific IPs while protecting against threats.</p>
<p><span id="more-15059"></span></p>
<h3>About the Pingback Vulnerability</h3>
<p>According to <a href="http://www.acunetix.com/blog/web-security-zone/wordpress-pingback-vulnerability/">this article</a>, there are four ways that <abbr title="WordPress">WP</abbr>&#8216;s <abbr title="eXtensible Markup Language - Remote Procedure Call">XML-RPC</abbr> <abbr title="Application Programming Interface">API</abbr> (specifically, the <code>pingback.ping</code> method) could be abused by an attacker:</p>
<ul>
<li><strong>Intel gathering</strong> &mdash; attacker may probe for specific ports in the target&#8217;s internal network</li>
<li><strong>Port scanning</strong> &mdash; attacker may port-scan hosts in the internal network</li>
<li><strong>DoS attacks</strong> &mdash; attacker may pingback via large number of sites for DoS attack</li>
<li><strong>Router hacking</strong> &mdash; attacker may reconfigure an internal router on the network</li>
</ul>
<p>Again, this is just a summary for reference, see the original article for more details on these various vulnerabilities as well as the <code>pingback.ping</code> method. No need to rehash everything here :)</p>
<h3>Protect against WordPress Pingback Vulnerability</h3>
<p>If you know you aren&#8217;t using the XML-RPC functionality for anything, and would like to protect against any vulnerabilities, you can lock things down with a simple slice of <a href="http://htaccessbook.com/" title=".htaccess made easy">.htaccess</a>:</p>
<pre><code># protect xmlrpc
&lt;IfModule mod_alias.c&gt;
	RedirectMatch 403 /xmlrpc.php
&lt;/IfModule&gt;</code></pre>
<p>Include that after any other rules in your site&#8217;s root <a href="http://perishablepress.com/category/web-design/htaccess/" title=".htaccess archive">.htaccess</a> file and you should be good to go. To test that it&#8217;s working, try accessing the <code>xmlrpc.php</code> file in your browser. If it&#8217;s working, you&#8217;ll get a &#8220;403 &#8211; Forbidden message&#8221;. <strong>Tip:</strong> to redirect requests for <code>xmlrpc.php</code> to a custom page, modify the <code>RedirectMatch</code> like so:</p>
<pre><code># protect xmlrpc
&lt;IfModule mod_alias.c&gt;
	Redirect 301 /xmlrpc.php http://example.com/custom-page.php
&lt;/IfModule&gt;</code></pre>
<h3 id="alt-method">Alternate .htaccess method</h3>
<p>Here is an alternate .htaccess technique for denying all access to <code>xmlrpc.php</code>:</p>
<pre><code># protect xmlrpc
&lt;Files xmlrpc.php&gt;
	Order Deny,Allow
	Deny from all
&lt;/Files&gt;</code></pre>
<p>Using this method, it&#8217;s possible to <em>allow</em> access to <code>xmlrpc.php</code> for specific <abbr title="Internet Protocol">IP</abbr> addresses. For example, if you know your Blogger and/or MovableType IP(s), you can whitelist them by adding an &#8220;Allow&#8221; line for each, like so:</p>
<pre><code># protect xmlrpc
&lt;Files xmlrpc.php&gt;
	Order Deny,Allow
	Deny from all
	Allow from 123.456.789
	Allow from 321.654.987
&lt;/Files&gt;</code></pre>
<p><strong>Note:</strong> if you use one of these .htaccess methods, keep in mind that it may be removed once the reported vulnerability is secured in a future version of WordPress.</p>
<p><strong>Thanks</strong> to <a href="http://www.millermosaicllc.com/">Yael K. Miller</a> for <a href="https://twitter.com/MillerMosaicLLC/status/286536582457069570">bringing this to my attention.</a></p>
<div class='yarpp-related-rss'>
<p>Related posts:</p><ol>
<li><a href='http://perishablepress.com/htaccess-password-protection-tricks/' rel='bookmark' title='HTAccess Password-Protection Tricks'>HTAccess Password-Protection Tricks</a></li>
<li><a href='http://perishablepress.com/htaccess-secure-phpinfo-php/' rel='bookmark' title='Is it Secret? Is it Safe?'>Is it Secret? Is it Safe?</a></li>
<li><a href='http://perishablepress.com/improve-site-security-by-protecting-htaccess-files/' rel='bookmark' title='Improve Site Security by Protecting HTAccess Files'>Improve Site Security by Protecting HTAccess Files</a></li>
</ol>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/perishablepress?a=IA4VU8LfvzM:BTMi2XjCjqI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=IA4VU8LfvzM:BTMi2XjCjqI:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=IA4VU8LfvzM:BTMi2XjCjqI:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=IA4VU8LfvzM:BTMi2XjCjqI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=IA4VU8LfvzM:BTMi2XjCjqI:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=IA4VU8LfvzM:BTMi2XjCjqI:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=IA4VU8LfvzM:BTMi2XjCjqI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=IA4VU8LfvzM:BTMi2XjCjqI:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=bcOpcFrp8Mo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://perishablepress.com/wordpress-xmlrpc-pingback-vulnerability/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>(Please) Stop Using Unsafe Characters in URLs</title>
		<link>http://perishablepress.com/stop-using-unsafe-characters-in-urls/</link>
		<comments>http://perishablepress.com/stop-using-unsafe-characters-in-urls/#comments</comments>
		<pubDate>Tue, 01 Jan 2013 01:08:10 +0000</pubDate>
		<dc:creator>Jeff Starr</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[blacklist]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[url]]></category>

		<guid isPermaLink="false">http://perishablepress.com/?p=15055</guid>
		<description><![CDATA[Just as there are specifications for designing with CSS, HTML, and JavaScript, there are specifications for working with URIs/URLs. The Internet Engineering Task Force (IETF) clearly defines these specifications in numerous documents, including the following: RFC3986: Uniform Resource Identifier (URI): Generic Syntax RFC1738: Uniform Resource Locators (URL) The specifications for Uniform Resource Identifiers (URIs) and more specifically Uniform Resource Locators (URLs) provide a safe, consistent way to request, identify, and resolve resources on the Internet. As clearly [...]]]></description>
				<content:encoded><![CDATA[<p>Just as there are specifications for designing with <abbr title="Cascading Style Sheets">CSS</abbr>, <abbr title="Hypertext Markup Language">HTML</abbr>, and JavaScript, there are specifications for working with <abbr title="Uniform Resource Identifiers">URI</abbr>s/<abbr title="Uniform Resource Locators">URL</abbr>s. The <a href="http://www.ietf.org/">Internet Engineering Task Force</a> (IETF) clearly defines these specifications in numerous documents, including the following:</p>
<p><span id="more-15055"></span></p>
<ul>
<li><a href="http://www.ietf.org/rfc/rfc3986.txt">RFC3986: Uniform Resource Identifier (URI): Generic Syntax</a></li>
<li><a href="http://www.ietf.org/rfc/rfc1738.txt">RFC1738: Uniform Resource Locators (URL)</a></li>
</ul>
<p>The specifications for Uniform Resource Identifiers (URIs) and more specifically Uniform Resource Locators (URLs) provide a safe, consistent way to request, identify, and resolve resources on the Internet. As clearly stated in RFC3986:</p>
<blockquote><p>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier.</p></blockquote>
<p>Thanks to the brilliant work of experts such as <a href="http://www.w3.org/People/Berners-Lee/">Tim Berners-Lee</a>, <a href="http://roy.gbiv.com/">Roy Fielding</a>, <a href="http://larry.masinter.net/">Larry Masinter</a>, and <a href="http://www.opencobalt.org/community/contributors-volunteers/mark-mccahill-collaborative-systems-architect">Mark McCahill</a>, developers have a safe, consistent protocol for working with URIs/URLs on the Web. It is <em>important</em> that we adhere to these specifications when developing software, plugins, apps, and the like. Failing to do so introduces potential security vulnerabilities which may be exploited by nefarious individuals and malicious scripts. </p>
<h3 id="character-encoding-chart">Character Encoding Chart</h3>
<p>To help promote the cause of Web Standards and adhering to specifications, here is a quick reference chart explaining which characters are &#8220;safe&#8221; and which characters should be encoded in URLs.</p>
<table class="default" cellspacing="0" cellpadding="0">
<thead>
<tr>
<th>Classification</th>
<th>Included characters</th>
<th>Encoding required?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Safe characters</td>
<td>Alphanumerics <code>[0-9a-zA-Z]</code>, special characters <code>$-_.+!*'()</code>, and reserved characters used for their reserved purposes (e.g., question mark used to denote a query string)</td>
<td class="focus">NO</td>
</tr>
<tr>
<td>ASCII Control characters</td>
<td>Includes the ISO-8859-1 (ISO-Latin) character ranges 00-1F hex (0-31 decimal) and 7F (127 decimal.)</td>
<td class="focus">YES</td>
</tr>
<tr>
<td>Non-ASCII characters</td>
<td>Includes the entire &#8220;top half&#8221; of the ISO-Latin set 80-FF hex (128-255 decimal.)</td>
<td class="focus">YES</td>
</tr>
<tr>
<td>Reserved characters</td>
<td><code>$ &amp; + , / : ; = ? @</code> (not including blank space)</td>
<td class="focus">YES*</td>
</tr>
<tr>
<td>Unsafe characters</td>
<td>Includes the blank/empty space and <code>" &lt; &gt; # % { } | \ ^ ~ [ ] `</code></td>
<td class="focus">YES</td>
</tr>
</tbody>
</table>
<p>* Note: Reserved characters only need encoding when not used for their defined, reserved purposes.</p>
<h4>Usafe Characters</h4>
<p>More about &#8220;unsafe&#8221; characters from <a href="http://www.ietf.org/rfc/rfc1738.txt">RFC1738</a>:</p>
<p>Characters can be unsafe for a number of reasons. The space character is unsafe because significant spaces may disappear and insignificant spaces may be introduced when URLs are transcribed or typeset or subjected to the treatment of word-processing programs. The characters &ldquo;<code>&lt;</code>&rdquo; and &ldquo;<code>&gt;</code>&rdquo; are unsafe because they are used as the delimiters around URLs in free text; the quote mark (&ldquo;<code>"</code>&rdquo;) is used to delimit URLs in some systems. The character &ldquo;<code>#</code>&rdquo; is unsafe and should always be encoded because it is used in World Wide Web and in other systems to delimit a URL from a fragment/anchor identifier that might follow it. The character &ldquo;<code>%</code>&rdquo; is unsafe because it is used for encodings of other characters. Other characters are unsafe because gateways and other transport agents are known to sometimes modify such characters. These characters are &ldquo;<code>{</code>&rdquo;, &ldquo;<code>}</code>&rdquo;, &ldquo;<code>|</code>&rdquo;, &ldquo;<code>\</code>&rdquo;, &ldquo;<code>^</code>&rdquo;, &ldquo;<code>~</code>&rdquo;, &ldquo;<code>[</code>&rdquo;, &ldquo;<code>]</code>&rdquo;, and &ldquo;<code>`</code>&rdquo;.</p>
<p>All unsafe characters must always be encoded within a URL. For example, the character &ldquo;<code>#</code>&rdquo; must be encoded within URLs even in systems that do not normally deal with fragment or anchor identifiers, so that if the URL is copied into another system that does use them, it will not be necessary to change the URL encoding.</p>
<h4>Reserved Characters</h4>
<p>More about &#8220;reserved&#8221; characters from <a href="http://www.ietf.org/rfc/rfc1738.txt">RFC1738</a>:</p>
<p>Many URL schemes reserve certain characters for a special meaning: their appearance in the scheme-specific part of the URL has a designated semantics. If the character corresponding to an octet is reserved in a scheme, the octet must be encoded.  The characters &ldquo;<code>;</code>&rdquo;, &ldquo;<code>/</code>&rdquo;, &ldquo;<code>?</code>&rdquo;, &ldquo;<code>:</code>&rdquo;, &ldquo;<code>@</code>&rdquo;, &ldquo;<code>=</code>&rdquo; and &ldquo;<code>&amp;</code>&rdquo; are the characters which may be reserved for special meaning within a scheme. No other characters may be reserved within a scheme.</p>
<p>Usually a URL has the same interpretation when an octet is represented by a character and when it encoded. However, this is not true for reserved characters: encoding a character reserved for a particular scheme may change the semantics of a URL.</p>
<p>Thus, only alphanumerics, the special characters &ldquo;<code>$-_.+!*'(),</code>&rdquo;, and reserved characters used for their reserved purposes may be used unencoded within a URL.</p>
<p>On the other hand, characters that are not required to be encoded (including alphanumerics) may be encoded within the scheme-specific part of a URL, as long as they are not being used for a reserved purpose.</p>
<h3>URLs in HTML and JavaScript</h3>
<p>In earlier versions of HTML, the entire range of the ISO-8859-1 (ISO-Latin) character set may be used in documents. Since HTML4, the entire Unicode character set may also be used. In <abbr title="Hypertext Transfer Protocol">HTTP</abbr>, however, the range of allowed characters is <em>expressly limited</em> to only a subset of the US-ASCII character set (see the <a href="#character-encoding-chart" title="Scroll to section" class="anchor">Character Encoding Chart</a> for details). </p>
<p>So, when writing HTML, ISO and Unicode characters may be used everywhere in the document <em>except</em> where URLs are referenced*. This includes the following elements:</p>
<pre><code>&lt;a&gt;, &lt;applet&gt;, &lt;area&gt;, &lt;base&gt;, &lt;bgsound&gt;, &lt;body&gt;,
&lt;embed&gt;, &lt;form&gt;, &lt;frame&gt;, &lt;iframe&gt;, &lt;img&gt;, &lt;input&gt;, &lt;link&gt;,
&lt;object&gt;, &lt;script&gt;, &lt;table&gt;, &lt;td&gt;, &lt;th&gt;, &lt;tr&gt;</code></pre>
<p>* <strong>Update</strong> (2013/01/03): As <a href="#comment-90254" class="anchor">Mathias explains</a>, &#8220;it&#8217;s perfectly okay to leave those symbols unencoded, as browsers will take care of them as per the URL parsing algorithm in the HTML spec.&#8221;</p>
<p>As flexible as HTML is in terms of which characters may be used, there are strict limits to which characters may be used when referencing URLs. This limitation applies not only to URLs used in HTML, but also to URLs referenced in <em>any</em> coding language (e.g., JavaScript, PHP, Perl, etc.).</p>
<h3 id="wp-unsafe-characters">Unsafe Characters in WordPress</h3>
<p>In version 3.5, WordPress uses improper, unencoded URLs to enqueue JavaScript libraries. Specifically, in the WP Admin area, various URLs are called using <em>square brakets</em> &ldquo;<code>[</code>&rdquo; and &ldquo;<code>]</code>&rdquo;, which are clearly classified as <strong>unsafe characters</strong>. Here is an example:</p>
<p><code>http://example.com/wp-admin/load-scripts.php?c=1&amp;load[]=swfobject,jquery,utils&amp;ver=3.5</code></p>
<p>Also affecting the WordPress Admin, here is an example of unsafe characters in URLs, pointed out in <a href="http://perishablepress.com/5g-blacklist-2012/comment-page-8/#comment-88414" title="Read Jeremy Clarke's comment">this comment</a>:</p>
<p><code>http://test.site/wp-admin/post.php?t=1347548645469?t=1347548651124?t=1347548656685?t=1347548662469?t=1347548672300?t=1347548681615?</code></p>
<p>&#8220;Special-use&#8221; specifies that the question mark &ldquo;<code>?</code>&rdquo; is reserved for the denotation of a query string, but must be encoded for any other purpose. Unfortunately, WordPress is including <em>multiple</em> unencoded question marks for URLs involved with its &#8220;preview&#8221; functionality. In other words, in any URL, the first question mark &ldquo;<code>?</code>&rdquo; may be unencoded to denote the query string, but subsequent &ldquo;<code>?</code>&rdquo; must be encoded.</p>
<p>These errors may not be a <em>huge</em> deal, but they increase potential vulnerability and certainly should be fixed in the next WP update. Likewise, future versions of WordPress should keep URI/URL specifications in mind and verify that all URLs are properly encoded.</p>
<h3 id="google-unsafe-characters">A Dangerous Trend</h3>
<p>WordPress isn&#8217;t the only popular piece of software that&#8217;s not following specification; rather, we&#8217;re seeing a disturbing trend wherein big companies such as Google are including unsafe characters in their URLs. Here is a <a href="http://perishablepress.com/block-bad-queries/comment-page-2/#comment-88889" title="Read Sergey's comment">recently reported example</a>:</p>
<p><code>http://blog.sergeys.us/beer?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+SergeySus+(Sergey+Sus+Photography+%C2%BB+Blog)&amp;amp;utm_content=Google+Reader</code></p>
<p>Notice the unencoded &ldquo;<code>:</code>&rdquo;? Apparently Google is including them in URLs for FeedBurner and Google Reader. Hopefully this is just an oversight that will be corrected in a future update.</p>
<p>For more examples of unsafe characters in popular apps and plugins, scan through some of the comments left on my <a href="http://perishablepress.com/5g-blacklist-2012/">5G</a>, <a href="http://perishablepress.com/6g-beta/">6G (beta)</a>, and <a href="http://perishablepress.com/block-bad-queries/" title="BBQ: Protect Against Malicious URL Requests">BBQ plugin</a>.</p>
<h3 id="blacklist">5G/6G Blacklist</h3>
<p>For the record, the <a href="http://perishablepress.com/5g-blacklist-2012/">5G Blacklist</a>, <a href="http://perishablepress.com/6g-beta/">6G Blacklist (beta)</a> &mdash; and all of my <a href="http://perishablepress.com/tag/blacklist/" title="Articles about blacklists, firewalls, and security">blacklists</a> for that matter &mdash; are built on the foundation of IETF specifications. As explained in detail <a href="http://perishablepress.com/building-the-perishable-press-4g-blacklist/" title="Building the Perishable Press 4G Blacklist">here</a> and <a href="http://perishablepress.com/building-the-5g-blacklist/" title="Building the 5G Blacklist">here</a>, the <a href="http://htaccessbook.com/" title=".htaccess made easy">.htaccess</a> rules used in my G-series firewalls are designed to block malicious URL requests such as those that contain <strong>unsafe characters</strong>. Other firewall/security plugins and scripts operate in similar fashion, using standards and specifications to determine which URLs are potentially dangerous. </p>
<blockquote><p>Developers, please stop using unsafe characters in URLs.</p></blockquote>
<p>Many people rely on such plugins and blacklists to help protect their sites against threatening activity, but such security measures fail when developers ignore specification and include unencoded characters in URLs. Worse, by introducing inconsistency into the system, noncompliant scripts pose a potential security risk and open the doors to attacks.</p>
<h4>WordPress and 5G Blacklist</h4>
<p>As mentioned, WordPress 3.5 <em>includes</em> unencoded square brackets in various URLs in the Admin area. As explained, the 5G Blacklist <em>blocks</em> such unsafe characters to help users secure their WP-powered sites. Thus, if you&#8217;re running both WordPress <em>and</em> 5G, there will be an issue wherein certain URL requests are denied with a &#8220;403 &#8211; Forbidden&#8221; response.</p>
<p>So, until WordPress can get things fixed up, here is how to modify the 5G Blacklist (don&#8217;t even <em>think</em> about modifying any WP core files) to &#8220;allow&#8221; those unsafe URLs to pass through the firewall.</p>
<p><strong>Step 1</strong></p>
<p>In the 5G Blacklist, locate this section of code:</p>
<pre><code># 5G:[QUERY STRINGS]
&lt;ifModule mod_rewrite.c&gt;
 RewriteEngine On
 RewriteBase /
 RewriteCond %{QUERY_STRING} (environ|localhost|mosconfig|scanner) [NC,OR]
 RewriteCond %{QUERY_STRING} (menu|mod|path|tag)\=\.?/? [NC,OR]
 RewriteCond %{QUERY_STRING} boot\.ini  [NC,OR]
 RewriteCond %{QUERY_STRING} echo.*kae  [NC,OR]
 RewriteCond %{QUERY_STRING} etc/passwd [NC,OR]
 RewriteCond %{QUERY_STRING} \=\\%27$   [NC,OR]
 RewriteCond %{QUERY_STRING} \=\\\'$    [NC,OR]
 RewriteCond %{QUERY_STRING} \.\./      [NC,OR]
 RewriteCond %{QUERY_STRING} \?         [NC,OR]
 RewriteCond %{QUERY_STRING} \:         [NC,OR]
 RewriteCond %{QUERY_STRING} \[         [NC,OR]
 RewriteCond %{QUERY_STRING} \]         [NC]
 RewriteRule .* - [F]
&lt;/ifModule&gt;</code></pre>
<p><strong>Step 2</strong></p>
<p>Replace that entire block of code with this revised version that excludes the rules that block the unsafe characters:</p>
<pre><code># 5G:[QUERY STRINGS]
&lt;ifModule mod_rewrite.c&gt;
 RewriteEngine On
 RewriteBase /
 RewriteCond %{QUERY_STRING} (environ|localhost|mosconfig|scanner) [NC,OR]
 RewriteCond %{QUERY_STRING} (menu|mod|path|tag)\=\.?/? [NC,OR]
 RewriteCond %{QUERY_STRING} boot\.ini  [NC,OR]
 RewriteCond %{QUERY_STRING} echo.*kae  [NC,OR]
 RewriteCond %{QUERY_STRING} etc/passwd [NC,OR]
 RewriteCond %{QUERY_STRING} \=\\%27$   [NC,OR]
 RewriteCond %{QUERY_STRING} \=\\\'$    [NC,OR]
 RewriteCond %{QUERY_STRING} \.\./      [NC,OR]
 RewriteCond %{QUERY_STRING} \?         [NC,OR]
 RewriteCond %{QUERY_STRING} \:         [NC]
 RewriteRule .* - [F]
&lt;/ifModule&gt;</code></pre>
<p>Done. No further edits should be required, unless you&#8217;ve made any of your own modifications.</p>
<h3>Take-home message</h3>
<p>When developing for the Web, adherence to standards and protocols is important. By taking the time to properly encode your URLs, you eliminate inconsistency, eliminate vulnerabilities, facilitate extensibility, and ensure proper functionality. Hopefully this article serves as a reminder and helps clear up any confusion about which characters need encoded and why it&#8217;s so important to do so.</p>
<div class='yarpp-related-rss'>
<p>Related posts:</p><ol>
<li><a href='http://perishablepress.com/blank-space-whitespace-character-htaccess/' rel='bookmark' title='Blank Space / Whitespace Character for .htaccess'>Blank Space / Whitespace Character for .htaccess</a></li>
<li><a href='http://perishablepress.com/wordpress-blacklist-characters/' rel='bookmark' title='10 Characters for Your WordPress Blacklist'>10 Characters for Your WordPress Blacklist</a></li>
<li><a href='http://perishablepress.com/php-encode-decode-data-urls/' rel='bookmark' title='PHP Tip: Encode &amp; Decode Data URLs'>PHP Tip: Encode &amp; Decode Data URLs</a></li>
</ol>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/perishablepress?a=7-bFWzM2DI0:aPI3Wr_1soA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=7-bFWzM2DI0:aPI3Wr_1soA:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=7-bFWzM2DI0:aPI3Wr_1soA:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=7-bFWzM2DI0:aPI3Wr_1soA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=7-bFWzM2DI0:aPI3Wr_1soA:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=7-bFWzM2DI0:aPI3Wr_1soA:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=7-bFWzM2DI0:aPI3Wr_1soA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=7-bFWzM2DI0:aPI3Wr_1soA:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=bcOpcFrp8Mo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://perishablepress.com/stop-using-unsafe-characters-in-urls/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Printed .htaccess books</title>
		<link>http://perishablepress.com/printed-htaccess-books/</link>
		<comments>http://perishablepress.com/printed-htaccess-books/#comments</comments>
		<pubDate>Thu, 27 Dec 2012 05:39:16 +0000</pubDate>
		<dc:creator>Jeff Starr</dc:creator>
				<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[books]]></category>

		<guid isPermaLink="false">http://perishablepress.com/?p=15053</guid>
		<description><![CDATA[After launching my new book .htaccess made easy back in September, I wanted to allow time to fix any errors or typos before sending the book to the printers. After a couple of months, I had updated the book three times with better code, new techniques, and design improvements. After a few final steps to optimize for print format, the books were ordered, printed and delivered fresh on Christmas Eve :) So to celebrate the event, all [...]]]></description>
				<content:encoded><![CDATA[<p>After launching my new book <a href="http://htaccessbook.com/">.htaccess made easy</a> back in September, I wanted to allow time to fix any errors or typos before sending the book to the printers. After a couple of months, I had <a href="http://htaccessbook.com/changelog/">updated the book three times</a> with better code, new techniques, and design improvements. After a few final steps to optimize for print format, the books were ordered, printed and delivered fresh on Christmas Eve :) So to celebrate the event, all printed <a href="http://htaccessbook.com/store/">.htaccess books</a> are on sale for <strong>$10 off</strong>, and all PDFs are on sale for <strong>$5 off</strong>.</p>
<p><span id="more-15053"></span></p>
<h3>About the printed books</h3>
<p>The printed books contain the same content as the PDF, over 200 pages of .htaccess how-to&#8217;s, techniques, tricks &amp; tips. The books are digitally printed in <em>full-color</em> on <em>glossy paper</em> with a coated <em>card-stock cover</em> and <strong>spiral binding</strong>. It&#8217;s a self-published thing of beauty, as you can see for yourself:</p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2012/htaccess-book-01.jpg" alt="[ .htaccess made easy - photo of printed books ]" /><br /><small>.htaccess made easy &#8211; printed books!</small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2012/htaccess-book-02.jpg" alt="[ .htaccess made easy - photo of front cover ]" /><br /><small>.htaccess made easy &#8211; front cover</small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2012/htaccess-book-03.jpg" alt="[ .htaccess made easy - content detail ]" /><br /><small>.htaccess made easy &#8211; content detail</small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2012/htaccess-book-04.jpg" alt="[ .htaccess made easy - content detail ]" /><br /><small>.htaccess made easy &#8211; content detail</small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2012/htaccess-book-05.jpg" alt="[ .htaccess made easy - page detail ]" /><br /><small>.htaccess made easy &#8211; page detail</small></p>
<p><img src="http://perishablepress.com/wp/wp-content/images/2012/htaccess-book-06.jpg" alt="[ .htaccess made easy - spiral binding ]" /><br /><small>.htaccess made easy &#8211; spiral binding</small></p>
<h3>Preview</h3>
<p>In addition to the <a href="http://htaccessbook.com/htaccess-made-easy_DEMO.pdf">PDF Demo</a>, also check out Aldo Latino&#8217;s recent <a href="http://www.aldolat.it/2012/news/htaccess-made-easy/">review of .htaccess made easy</a>, which is in <strike>Spanish</strike> Italian but includes some nice screenshots from the book :) <strong>Update:</strong> <a href="http://m0n.co/k">Here is an English-translated version of the review</a> (via Google Translate).</p>
<h3>Get your copy</h3>
<p>Supplies are limited, <a href="http://htaccessbook.com/store/">so get your copy now</a>. For the remainder of 2012, all printed books are sale for $10 off regular price. So you can get the printed book for <strong>$40</strong> or the combo pack (print + PDF) for <strong>$50</strong>. Visit <a href="http://htaccessbook.com/store/">the book store</a> for more details.</p>
<h3>Digging into WordPress</h3>
<p>To help promote my other book, <a href="http://digwp.com/">Digging into WordPress</a>, I&#8217;m offering a deal where you can get both printed books with even more savings. <a href="mailto:sales@digwp.com">Contact me</a> for more information.</p>
<div class='yarpp-related-rss'>
<p>Related posts:</p><ol>
<li><a href='http://perishablepress.com/print-version-digging-into-wordpress-3/' rel='bookmark' title='Print Version of Digging into WordPress 3.0'>Print Version of Digging into WordPress 3.0</a></li>
<li><a href='http://perishablepress.com/print-version-digging-into-wordpress/' rel='bookmark' title='Print Version of Digging into WordPress is Here!'>Print Version of Digging into WordPress is Here!</a></li>
<li><a href='http://perishablepress.com/new-book/' rel='bookmark' title='New Book!'>New Book!</a></li>
</ol>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/perishablepress?a=KJLPRE8nxXE:FYh5h-MgE1Y:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=KJLPRE8nxXE:FYh5h-MgE1Y:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=KJLPRE8nxXE:FYh5h-MgE1Y:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=KJLPRE8nxXE:FYh5h-MgE1Y:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/perishablepress?i=KJLPRE8nxXE:FYh5h-MgE1Y:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=KJLPRE8nxXE:FYh5h-MgE1Y:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=KJLPRE8nxXE:FYh5h-MgE1Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/perishablepress?a=KJLPRE8nxXE:FYh5h-MgE1Y:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/perishablepress?d=bcOpcFrp8Mo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://perishablepress.com/printed-htaccess-books/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
