Solved

removing page extension using mod_rewrite

Posted on 2009-07-08
9
600 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
Optimize your web performance

What's in the eBook?
- Full list of reasons for poor performance
- Ultimate measures to speed things up
- Primary web monitoring types
- KPIs you should be monitoring in order to increase your ROI

 
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

Flexible connectivity for any environment

The KE6900 series can extend and deploy computers with high definition displays across multiple stations in a variety of applications that suit any environment. Expand computer use to stations across multiple rooms with dynamic access.

Question has a verified solution.

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

In Solr 4.0 it is possible to atomically (or partially) update individual fields in a document. This article will show the operations possible for atomic updating as well as setting up your Solr instance to be able to perform the actions. One major …
Nothing in an HTTP request can be trusted, including HTTP headers and form data.  A form token is a tool that can be used to guard against request forgeries (CSRF).  This article shows an improved approach to form tokens, making it more difficult to…
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 look for a specific file type in a local or remote server directory using PHP.

636 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