Owen Garfield
Owen Garfield

Reputation: 35

Clean URLs in a subfolder

I've read and followed guides and looked for answers to other people's questions, but I'm struggling with url rewriting and htaccess.

I have a subfolder on my site with an index page which handles query strings to bring up dynamic content. I'd like the variable to appear to be a subfolder name e.g.

http://mywebsite.com/subfolder/index.php?v=variable

to

http://mywebsite.com/subfolder/variable

The .htaccess file I've made is at http://mywebsite.com/subfolder/ i.e. the same folder as index.php

How can I get this to work? Any help gratefully appreciated.

Upvotes: 1

Views: 701

Answers (2)

Justin Iurman
Justin Iurman

Reputation: 19016

You can use these rules inside your /subfolder/.htaccess

RewriteEngine On
RewriteBase /subfolder/

RewriteCond %{THE_REQUEST} \s/subfolder/index\.php\?v=([^&\s]+) [NC]
RewriteRule ^ %1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)$ index.php?v=$1 [L]

Update (passing two values)

RewriteEngine On
RewriteBase /subfolder/

RewriteCond %{THE_REQUEST} \s/subfolder/index\.php\?v=([^&\s]+)&v2=([^&\s]+)\s [NC]
RewriteRule ^ %1/%2? [R=301,L]

RewriteCond %{THE_REQUEST} \s/subfolder/index\.php\?v=([^&\s]+)\s [NC]
RewriteRule ^ %1? [R=301,L]

# Don't touch to existing files/folders
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# Rewrite /xxx to /index.php?v=xxx
RewriteRule ^([^/]+)$ index.php?v=$1 [L]

# Rewrite /xxx/yyy to /index.php?v=xxx&v2=yyy
RewriteRule ^([^/]+)/([^/]+)$ index.php?v=$1&v2=$2 [L]

Upvotes: 1

Joe
Joe

Reputation: 4907

Use this in your .htaccess:

RewriteEngine On
RewriteCond %{QUERY_STRING} v=(.+)$ [NC]
RewriteRule ^ subfolder/%1? [R=301,L,NE]

This grabs the variable using %{QUERY_STRING} and then appends it to the rewrite using %1. You'll see I've added a ? onto the end of the rewrite. That is to stop the original query from appearing on the end of the URL.

I've used R=301 which is a permanent redirect. You might want to changes this to R=302 while you're testing, as this is temporary.

You can view a test of this rule working here: https://htaccess.madewithlove.be?share=7b6832e9-2c05-5d1d-916c-e4dd0f5b1da6

Make sure you clear your cache before testing this.

Upvotes: 1

Related Questions