Josh979
Josh979

Reputation: 361

How to make dynamic directories and subdirectories via .htaccess

I am trying to create an htaccess script that will create directories for either zero, one, or two variables.

My file that is being used accepts the following 2 get variables. make and model.

This is a 3 step page. I currently have the page located at at /new.php. This page allows a user to select the first variable (in my case, a vehicle make). By selecting a make on this page the user is taken to /new.php?make=Acura. This page now displays a list of all Acura models. From here, the user can click a model, and they will be directed to /new.php?make=Acura&model=TLX. They can now choose a submodel and will be taken to an information page.

So I'm trying to get:

new.php to go to /new/
new.php?make=XMake to go to /new/XMake/
and new.php?make=XMake&model=XModel to go to /new/XMake/XModel/

This is as far as I have gotten with my code:

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^new/(.*)$ new.php?make=$1 [L,NC]

However any variables I add after this seem to break the first directory? Why is this?

Upvotes: 3

Views: 142

Answers (2)

Olaf Dietsche
Olaf Dietsche

Reputation: 74078

The order of the rules is important. With this rule at the beginning, any request /new/, /new/XMake or /new/XMake/XModel/ matches, and the following rules are ignored.

To match the other rules, the more specific must come first, e.g.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^new/(.+?)/(.+)$ new.php?make=$1&model=$2 [L,NC]

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^new/$ new.php [L,NC]

Upvotes: 1

anubhava
anubhava

Reputation: 785571

You can use these rules in your site root .htaccess:

Options -MultiViews
RewriteEngine On

# skip all files and directories from rewrite rules below
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^new/([\w-]+)/([\w-]+)/?$ new.php?make=$1&model=$2 [L,NC,QSA]

RewriteRule ^new/([\w-]+)/?$ new.php?make=$1 [L,NC,QSA]

RewriteRule ^new/?$ new.php [L,NC]

Upvotes: 1

Related Questions