You are not logged in.
Hi,
Textpattern articles are currently reachable via several different URL paths. For example:
http://example.com/article/5/
http://example.com/article/5/article-title
http://example.com/article/5/old-article-title-before-i-renamed-it-to-something-shorter
External factors can multiply these (e.g. www.example.com vs. example.com).
This can cause problems with search engines and link aggregators, since they don’t have any way of knowing that all of these URLs represent the same page (as opposed to multiple pages with identical content).
txp:zem_redirect is designed to help reduce the problem a bit. It checks the URL used to fetch each article; if it doesn’t match the correct URL for the article (including the article-title and full hostname as specified in the Textpattern config), it’ll return a 301 Moved Permanently response to direct the user’s browser to the correct URL. It also works as a 404 handler for articles that don’t exist or are not visible.
Just plonk the tag <txp:zem_redirect /> at the top of your article page, and it’ll do the rest. It must be the very first tag on the page, before the doctype. It has no effect in messy URL mode, or on pages other than individual articles.
warning – if you’re already using URL rewriting or other clever redirection, there’s a chance this could cause circular redirects. Test carefully, and don’t say I didn’t warn ye.
http://vigilant.tv/documents/tp/zem_redirect-0.5.txt
z.
As this plugin is no longer supported we provide it here
YToxMDp7czo0OiJuYW1lIjtzOjEyOiJ6ZW1fcmVkaXJlY3QiO3M6NjoiYXV0aG9yIjtzOjExOiJBbGV4IFNoaWVscyI7czoxMDoiYXV0aG9yX3VyaSI7czoyNjoiaHR0cDovL3RocmVzaG9sZHN0YXRlLmNvbS8iO3M6NzoidmVyc2lvbiI7czo1OiIxLjIuMSI7czoxMToiZGVzY3JpcHRpb24iO3M6NTk6IlJlZGlyZWN0IFBybzogaGFuZGxlIGluY29ycmVjdCwgb3V0ZGF0ZWQgYW5kIGR1cGxpY2F0ZSBVUkxzIjtzOjQ6ImhlbHAiO3M6Mjk3OiI8cD5UaGlzIHBsdWctaW4ncyBoZWxwIGRvY3VtZW50cyBhcmUgYXZhaWxhYmxlIHRvIHBheWluZyBzdWJzY3JpYmVycyBvbmx5LiA8c3Ryb25nPk5ldyBzdWJzY3JpcHRpb25zIGFyZSBjdXJyZW50bHkgdW5hdmFpbGFibGUuPC9zdHJvbmc+IEN1cnJlbnQgc3Vic2NyaWJlcnMgY2FuIGFjY2VzcyB0aGUgaGVscCBkb2N1bWVudHMgYnkgdmlzaXRpbmc6IDxhIGhyZWY9Imh0dHA6Ly90aHJlc2hvbGRzdGF0ZS5jb20vc3Vic2NyaWJlcnMvICI+aHR0cDovL3RocmVzaG9sZHN0YXRlLmNvbS9zdWJzY3JpYmVycy8gPC9hPjwvcD4iO3M6NDoiY29kZSI7czo1NjcwOiIvKg0KDQpDb3B5cmlnaHQgMjAwNS0yMDA3IEFsZXggU2hpZWxzIGh0dHA6Ly90aHJlc2hvbGRzdGF0ZS5jb20vDQoNClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQp2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQoNClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQoNCiovDQoNCmZ1bmN0aW9uIHplbV9yZWRpcmVjdF9maXhfdXJsKCR1cmwsICRkZWJ1Zz0wKSB7DQoJJHBhcnRzID0gcGFyc2VfdXJsKCR1cmwpOw0KCWV4dHJhY3QoJHBhcnRzKTsNCgkkcSA9IHByZWdfcmVwbGFjZSgnQCZhbXA7QCcsICcmJywgQCRxdWVyeSk7DQoJJHEgPSAkcSA/ICc/Jy4kcSA6ICcnOw0KDQoJJGhvc3QgPSBlbXB0eSgkc2NoZW1lKSA/IHNlcnZlclNldCgnSFRUUF9IT1NUJykgOiAkaG9zdDsNCgkkc2NoZW1lID0gZW1wdHkoJHNjaGVtZSkgPyAnaHR0cCcgOiAkc2NoZW1lOw0KCSRwb3J0ID0gZW1wdHkoJHBvcnQpID8gJycgOiAnOicuJHBvcnQ7DQoNCglyZXR1cm4gJHNjaGVtZS4nOi8vJy4kaG9zdC4kcG9ydC4nLycubHRyaW0oJHBhdGgsICcvJykuJHE7DQp9DQoNCmZ1bmN0aW9uIHplbV9yZWRpcmVjdF9zZW5kX2hlYWRlcnMoJGxvY2F0aW9uLCAkdHlwZT0nJywgJGRlYnVnPTApIHsNCglnbG9iYWwgJHByZWZzLCAkcHJldGV4dDsNCglleHRyYWN0KCRwcmVmcyk7DQoNCglpZiAoJHByb2R1Y3Rpb25fc3RhdHVzID09ICdkZWJ1Zycgb3IgJGRlYnVnKSB7DQoJCWVjaG8gJzxkaXYgc3R5bGU9ImNvbG9yOiMwMDA7YmFja2dyb3VuZC1jb2xvcjojZmVlOyI+Jw0KCQkJLid6ZW1fcmVkaXJlY3Q6IGZyb20gPGEgaHJlZj0iJy4kcHJldGV4dFsncmVxdWVzdF91cmknXS4nIj4nLiRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLic8L2E+IHRvIDxhIGhyZWY9IicuJGxvY2F0aW9uLiciPicuJGxvY2F0aW9uLic8L2E+PC9kaXY+Jy5uOw0KCQlyZXR1cm4gJGxvY2F0aW9uOw0KCX0NCgllbHNlIHsNCgkJaWYgKCRwcm9kdWN0aW9uX3N0YXR1cyA9PSAnbGl2ZScpIHsNCgkJCWlmICghJHR5cGUpDQoJCQkJJHR5cGUgPSAnMzAxIE1vdmVkIFBlcm1hbmVudGx5JzsNCgkJfQ0KCQllbHNlDQoJCQkkdHlwZSA9ICczMDIgRm91bmQnOw0KDQoJCXR4cF9zdGF0dXNfaGVhZGVyKCR0eXBlKTsNCgkJaGVhZGVyKCJMb2NhdGlvbjogJGxvY2F0aW9uIik7DQoJCW9iX2ZsdXNoKCk7DQoJCWV4aXQ7DQoJfQ0KDQp9DQoNCg0KCWZ1bmN0aW9uIHplbV9yZWRpcmVjdF91cmwoJHRlc3Q9MCkgew0KCQlnbG9iYWwgJHByZXRleHQsICRzaXRldXJsLCAkcGF0aF9mcm9tX3Jvb3QsICRwcmVmczsNCg0KCQlleHRyYWN0KCRwcmVmcyk7DQoNCiAJCWlmIChlbXB0eSgkcGVybWxpbmtfbW9kZSkNCiAJCQlvciAkcGVybWxpbmtfbW9kZSA9PSAnbWVzc3knDQoJCQlvciBzdHJjYXNlY21wKHNlcnZlclNldCgnUkVRVUVTVF9NRVRIT0QnKSwgJ1BPU1QnKSA9PSAwDQoJCQlvciBncHMoJ3R4cHJldmlldycpKQ0KIAkJCXJldHVybjsNCg0KDQoJCSRhY3R1YWxfaG9zdCA9IHNlcnZlclNldCgiSFRUUF9IT1NUIik7DQoJCSRhY3R1YWxfcGF0aCA9ICgkdGVzdCAhPT0gMCA/ICR0ZXN0IDogJHByZXRleHRbJ3JlcXVlc3RfdXJpJ10pOw0KCQkkYWN0dWFsX3VybCA9ICdodHRwOi8vJy4kYWN0dWFsX2hvc3QuJGFjdHVhbF9wYXRoOw0KCQkkY2Fub25pY2FsX3VybCA9ICcnOw0KDQoJCSMgb3RoZXIgdW5rbm93biBxdWVyeSBwYXJhbWV0ZXJzIG1pZ2h0IGJlIHVzZWQgYnkgcGx1Z2lucw0KCQkkZ2V0ID0gZ3BzYShhcnJheV9rZXlzKCRfR0VUKSk7DQoJCWlmICghJGdldCkgJGdldCA9IGFycmF5KCk7DQoJCXVuc2V0KCRnZXRbJ2lkJ10pOw0KCQl1bnNldCgkZ2V0WydzJ10pOw0KCQl1bnNldCgkZ2V0WydjJ10pOw0KDQoJCS8vIHJlbW92ZSBib2d1cyBHRVQgcGFyYW1hdGVycyBpbnNlcnRlZCBieSByc3NfdW5saW1pdGVkX2NhdGVnb3JpZXMNCgkJZ2xvYmFsICRwbHVnaW5zOw0KCQlpZiAoQGluX2FycmF5KCdyc3NfdW5saW1pdGVkX2NhdGVnb3JpZXMnLCAkcGx1Z2lucykpIHsNCgkJCXVuc2V0KCRnZXRbJ3JlcXVlc3RfdXJpJ10pOw0KCQkJdW5zZXQoJGdldFsncXMnXSk7DQoJCX0NCg0KCQlpZiAoZ3BzKCdhdG9tJykgb3IgZ3BzKCdyc3MnKSkgew0KCQkJJGNhbm9uaWNhbF91cmwgPSBwYWdlbGlua3VybCgkZ2V0KTsNCgkJfQ0KCQllbHNlaWYgKCRwcmV0ZXh0WydzdGF0dXMnXSA9PSA0MDQpIHsNCgkJCS8vIHVybCB3aXRoIHN1YmRpciBzdHJpcHBlZA0KCQkJJHVybCA9IEAkcHJldGV4dFsncmVxJ107DQoNCgkJCWlmIChwcmVnX21hdGNoKCdALyhcZHs0fSkvKFxkezJ9KS8oXGR7Mn0pLyhbXi8/XSopLz9AJywgJHVybCwgJG0pKSB7DQoJCQkJJHdoZW4gPSAkbVsxXS4nLScuJG1bMl0uJy0nLiRtWzNdOw0KCQkJCSRycyA9IGxvb2t1cEJ5RGF0ZVRpdGxlKCR3aGVuLCRtWzRdKTsNCgkJCQlpZiAoISRycykNCgkJCQkJJHJzID0gbG9va3VwQnlUaXRsZSgkbVs0XSk7DQoJCQl9DQoJCQllbHNlaWYgKHByZWdfbWF0Y2goJ0AvKFteL10rKS8oXGQrKS8oW14vP10rKS8/QCcsICR1cmwsICRtKSkgew0KCQkJCSRycyA9IGxvb2t1cEJ5SUQoJG1bMl0pOw0KCQkJfQ0KCQkJZWxzZWlmIChwcmVnX21hdGNoKCdALyhbXi8/XSspLyhbXi8/XSspLz9AJywgJHVybCwgJG0pKSB7DQoJCQkJaWYgKGlzX251bWVyaWMoJG1bMl0pKQ0KCQkJCQkkcnMgPSBsb29rdXBCeUlEKCRtWzJdKTsNCgkJCQllbHNlIHsNCgkJCQkJJHJzID0gbG9va3VwQnlUaXRsZVNlY3Rpb24oJG1bMl0sICRtWzFdKTsNCgkJCQkJaWYgKCEkcnMpDQoJCQkJCQkkcnMgPSBsb29rdXBCeVRpdGxlKCRtWzJdKTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlaWYgKHByZWdfbWF0Y2goJ0AvKFteLz9dKykvP0AnLCAkdXJsLCAkbSkpIHsNCgkJCQkkcnMgPSBsb29rdXBCeVRpdGxlKCRtWzFdKTsNCgkJCX0NCg0KCQkJaWYgKCRycykgew0KCQkJCSRjYW5vbmljYWxfdXJsID0gcGVybWxpbmt1cmxfaWQoJHJzWydJRCddKSAuIGpvaW5fcXMoJGdldCk7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCX0NCgkJZWxzZWlmICgkcHJldGV4dFsncyddID09ICdmaWxlX2Rvd25sb2FkJykgew0KCQkJcmV0dXJuOw0KCQl9DQoJCWVsc2VpZiAoJHByZXRleHRbJ21vbnRoJ10gYW5kICRwZXJtbGlua19tb2RlID09ICd5ZWFyX21vbnRoX2RheV90aXRsZScpIHsNCgkJCXJldHVybjsNCgkJfQ0KCQllbHNlaWYgKCRwcmV0ZXh0WyJpZCJdKSB7DQoJCQkjIEFydGljbGUgcGFnZQ0KCQkJJHBhcnRzID0gcGFyc2VfdXJsKCRwcmV0ZXh0WydyZXEnXSk7DQoJCQlpZiAoaXNzZXQoJHBhcnRzWydwYXRoJ10pKSB7DQoJCQkJJHBhdGhpbmZvID0gcGF0aGluZm8oJHBhcnRzWydwYXRoJ10pOw0KCQkJCWlmICghZW1wdHkoJHBhdGhpbmZvWydleHRlbnNpb24nXSkgYW5kICRwYXRoaW5mb1snYmFzZW5hbWUnXSAhPSAnaW5kZXgucGhwJykgew0KCQkJCQlyZXR1cm47DQoJCQkJfQ0KCQkJfQ0KCQkJJGlkID0gc2FmZV9maWVsZCgiSUQiLCJ0ZXh0cGF0dGVybiIsIklEPSciLmRvU2xhc2goJHByZXRleHRbImlkIl0pLiInIGFuZCBTdGF0dXMgSU4gKCc0JywgJzUnKSBsaW1pdCAxIik7DQoJCQlpZiAoJGlkKSB7DQoJCQkJJGNhbm9uaWNhbF91cmwgPSBwZXJtbGlua3VybF9pZCgkaWQpOw0KCQkJfQ0KDQoJCQkjIHJlYXR0YWNoIG1lc3N5IFVSTCBwYXJhbWV0ZXJzLCBpZiBhbnkNCgkJCSRjYW5vbmljYWxfdXJsIC49IGpvaW5fcXMoJGdldCk7DQoJCX0NCgkJZWxzZSB7DQoJCQkjIExpc3QgcGFnZQ0KCQkJJGNhbm9uaWNhbF91cmwgPSBwYWdlbGlua3VybCgkZ2V0LCBhcnJheSgncyc9PiRwcmV0ZXh0WydzJ10sICdjJz0+JHByZXRleHRbJ2MnXSkpOw0KCQl9DQoNCgkJaWYgKCRjYW5vbmljYWxfdXJsKSB7DQoNCgkJCSMgZml4IHVwIGFtcGVyc2FuZHMNCgkJCSRjYW5vbmljYWxfdXJsID0gemVtX3JlZGlyZWN0X2ZpeF91cmwoJGNhbm9uaWNhbF91cmwpOw0KCQkJaWYgKCRhY3R1YWxfdXJsICE9ICRjYW5vbmljYWxfdXJsKSB7DQoJCQkJcmV0dXJuIHplbV9yZWRpcmVjdF9zZW5kX2hlYWRlcnMoJGNhbm9uaWNhbF91cmwsICczMDEgTW92ZWQgUGVybWFuZW50bHknLCAkdGVzdCAhPT0gMCk7DQoJCQl9DQoJCX0NCg0KCX0NCg0KDQpmdW5jdGlvbiB6ZW1fcmVkaXJlY3RfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7DQoJaWYgKCRldmVudCA9PSAndGV4dHBhdHRlcm4nKQ0KCQl6ZW1fcmVkaXJlY3RfdXJsKCk7DQp9DQoNCnJlZ2lzdGVyX2NhbGxiYWNrKCd6ZW1fcmVkaXJlY3RfaGFuZGxlcicsICd0ZXh0cGF0dGVybicpOw0KDQppZiAodHhwaW50ZXJmYWNlID09ICdwdWJsaWMnIGFuZCAoZ3BzKCdhdG9tJykgb3IgZ3BzKCdyc3MnKSkpIHsNCgl6ZW1fcmVkaXJlY3RfdXJsKCk7DQp9DQoNCg0KZnVuY3Rpb24gemVtX3JlZGlyZWN0KCRhdHRzKSB7DQoJZ2xvYmFsICRwcmV0ZXh0Ow0KDQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ3RvJyA9PiAnJywNCgkJJ2Zyb20nID0+ICcnLA0KCQknZGVidWcnID0+IDAsDQoJCSd0eXBlJyA9PiAnMzAyJywNCgkpLCAkYXR0cykpOw0KDQoJJHRvID0gdHJpbSgkdG8pOw0KCSRmcm9tID0gdHJpbSgkZnJvbSk7DQoNCg0KCSRkZXN0ID0gJyc7DQoJaWYgKCRmcm9tIGFuZCAkdG8pIHsNCgkJJGZyb20gPSBhZGRjc2xhc2hlcygkZnJvbSwgJ0AnKTsNCgkJJHRvID0gYWRkY3NsYXNoZXMoJHRvLCAnQCcpOw0KCQlpZiAocHJlZ19tYXRjaCgnQCcuJGZyb20uJ0AnLCAkcHJldGV4dFsncmVxdWVzdF91cmknXSkpIHsNCgkJCSRvdXQgPSBwcmVnX3JlcGxhY2UoJ0AnLiRmcm9tLidAJywgJHRvLCAkcHJldGV4dFsncmVxdWVzdF91cmknXSk7DQoJCQkkZGVzdCA9IHplbV9yZWRpcmVjdF9maXhfdXJsKCRvdXQsICRkZWJ1Zyk7DQoJCX0NCgl9DQoJZWxzZWlmICgkdG8pIHsNCgkJJGRlc3QgPSB6ZW1fcmVkaXJlY3RfZml4X3VybCgkdG8sICRkZWJ1Zyk7DQoJfQ0KCWVsc2Ugew0KCQl0cmlnZ2VyX2Vycm9yKCdObyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQnKTsNCgl9DQoNCgkkYWN0dWFsX2hvc3QgPSBzZXJ2ZXJTZXQoIkhUVFBfSE9TVCIpOw0KCSRhY3R1YWxfcGF0aCA9ICgkdGVzdCAhPT0gMCA/ICR0ZXN0IDogJHByZXRleHRbJ3JlcXVlc3RfdXJpJ10pOw0KCSRhY3R1YWxfdXJsID0gJ2h0dHA6Ly8nLiRhY3R1YWxfaG9zdC4kYWN0dWFsX3BhdGg7DQoNCglpZiAoJGRlc3QgYW5kICRkZXN0ICE9ICRhY3R1YWxfdXJsKSB7DQoJCSRzdGF0dXMgPSAoJHR5cGUgPT0gJzMwMScgPyAnMzAxIE1vdmVkIFBlcm1hbmVudGx5JyA6ICczMDIgRm91bmQnKTsNCgkJcmV0dXJuIHplbV9yZWRpcmVjdF9zZW5kX2hlYWRlcnMoJGRlc3QsICRzdGF0dXMsICRkZWJ1Zyk7DQoJfQ0KDQp9DQoiO3M6NDoidHlwZSI7czoxOiIwIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6MzoibWQ1IjtzOjMyOiJkM2UzNjRiZTY2NWNkODNjNTIxZWFmODdiMjQ3NDMyZiI7fQ==
Last edited by zem (2004-07-10 02:53:25)
Alex
tstate
Offline
There’s a new version up:
http://vigilant.tv/documents/tp/zem_redirect-0.2.txt
Changes in this version:
Last edited by zem (2004-07-04 01:15:05)
Alex
tstate
Offline
And again:
http://vigilant.tv/documents/tp/zem_redirect-0.3.txt
Changes:
Alex
tstate
Offline
I can’t seem to get it to work. The thing keeps on redirecting itself whenever i try to access an individual article. Any ideas?
Offline
Excellent plugin, zem. You might want consider letting people specify an article number (through a plugin parameter, preferably) containing an error message and redirect to it in case of a 404.
Also, you should check for ‘query’ index in a way that doesn’t generate the ‘Undefined indexes’ notice, e. g.
if (!empty($parts["query"]))
Who’s gonna textdrive you home tonight?
Offline
ThrokFeroth, do you have any other URL redirection or rewriting configured? Is your “web domain” setting correct?
Mamash – thanks for the suggestions. I’ll put together a new version that supports a few attributes to control its behaviour.
Alex
tstate
Offline