Solved

removing page extension using mod_rewrite

Posted on 2009-07-08
9
588 Views
Last Modified: 2012-05-07
ok i have successfully removed my pages' extensions using mod_rewrite, but now I'd like to take it a step further. Right now, a page named "domain.com/example.php" is linked from my other pages as "domain.com/extension" and it works. If someone mistakenly links to the page with the trailing slash (ex: domain.com/example/) then my htaccess file removes the trailing slash from the url (redirecting to the no trailing slash version). The problem I have now is if the page is accessed with the extension (domain.com/example.php) it does not redirect to the correct format (no extension & no slash). Basically creating duplicate content in the eyes of Google. I know this isn't a big deal since no one will know the extension of the page, but better safe than sorry. Is there another htaccess snippet i can use to force the extension removal of every page (without doing this for each individual page) or a line of php i can insert into the header of the pages that redirects it to the correct format? thanks in advance. my current htaccess code is below...
Options +FollowSymlinks
RewriteEngine on
 
# canonical domain rewrites
RewriteCond %{HTTP_HOST} ^domain.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php
RewriteRule ^index\.php$ http://www.domain.com/ [R=301,L]
 
# remove extensions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=permanent,QSA]
 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]

Open in new window

0
Comment
Question by:xill2678
  • 4
  • 3
  • 2
9 Comments
 
LVL 51

Expert Comment

by:ahoffmann
ID: 24812678
RewriteCond %{REQUEST_URI} !\.php$
0
 
LVL 1

Author Comment

by:xill2678
ID: 24817077
this snippet doesnt seem to be doing anything for me. is it suppose to replace something?
0
 
LVL 42

Expert Comment

by:David S.
ID: 24817352
It won't do anything by itself, since it's just a condition.

Try this:
RewriteCond %{REQUEST_URI} \.php$
RewriteRule ^(.*)\.php$ http://www.domain.com/$1 [R=301,L]

Open in new window

0
What is SQL Server and how does it work?

The purpose of this paper is to provide you background on SQL Server. It’s your self-study guide for learning fundamentals. It includes both the history of SQL and its technical basics. Concepts and definitions will form the solid foundation of your future DBA expertise.

 
LVL 1

Author Comment

by:xill2678
ID: 24817676
i tried adding this to what i have, and i tried replacing what i have with this snippet. one way removed the extension but caused a 404 error. the other way resulted in a redirect loop :(

i'm new to rewrites, so i'll post what i have so far. i'm sure it's something small that i'm overlooking or doing wrong. the snippet you gave is the bottom two lines
# remove extensions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=permanent,QSA]
 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]
 
RewriteCond %{REQUEST_URI} \.php$
RewriteRule ^(.*)\.php$ http://www.domain.com/$1 [R=301,L]

Open in new window

0
 
LVL 42

Expert Comment

by:David S.
ID: 24818066
Does putting it first help?
RewriteCond %{REQUEST_URI} \.php$
RewriteRule ^(.*)\.php$ http://www.domain.com/$1 [R=301,L]
 
# remove extensions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=permanent,QSA]
 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]

Open in new window

0
 
LVL 1

Author Comment

by:xill2678
ID: 24818188
no, unfortunately that throws it into a redirect loop again
0
 
LVL 42

Accepted Solution

by:
David S. earned 500 total points
ID: 24818315
Try this:
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
 
# remove extensions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=permanent,QSA]
 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]
 
RewriteCond %{REQUEST_URI} \.php$
RewriteRule ^(.*)\.php$ http://www.domain.com/$1 [R=301,L]

Open in new window

0
 
LVL 1

Author Comment

by:xill2678
ID: 24818819
that works perfectly!! THANKS :)
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 24821309
> RewriteCond %{REQUEST_URI} \.php$
this may cause a rewrite loop, that's why I used ! for negation:)
I'm wondering that the accepted suggestion works.
0

Featured Post

Migrating Your Company's PCs

To keep pace with competitors, businesses must keep employees productive, and that means providing them with the latest technology. This document provides the tips and tricks you need to help you migrate an outdated PC fleet to new desktops, laptops, and tablets.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Need To Change Centos 6 Timestamp Form In Log File 24 71
mysql between clause 2 24
paypal ipn to mysql 3 38
tutorial for ebay api 3 34
If you've heard about htaccess and it sounds like it does what you want, but you're not sure how it works... well, you're in the right place. Read on. Some Basics #1. It's a file and its filename is .htaccess (yes, with a dot in the front). #…
3 proven steps to speed up Magento powered sites. The article focus is on optimizing time to first byte (TTFB), full page caching and configuring server for optimal performance.
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to dynamically set the form action using jQuery.

778 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question