Ahmed Adel
Ahmed Adel

Reputation: 13

htaccess rule conflict with another rule

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ product.php?ref=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ /category.php?sub=$1 [L]

The values sent with variable sub conflicts with values from ref

product.php?ref=$1 [L]
category.php?sub=$1 [L]

Upvotes: 1

Views: 79

Answers (2)

anubhava
anubhava

Reputation: 785256

With little bit of change following code should work:

Options +FollowSymLinks -MultiViews
RewriteEngine On 

# don't do anything for a valid file or directory
RewriteCond %{ENV:REDIRECT_STATUS} !^$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# Product handler /i/test
RewriteRule ^i/([^/]+)/?$ /product.php?ref=$1 [L,NC,QSA]

# PHP handler
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [L]

# category handler
RewriteRule ^([^/]+)/?$ /category.php?sub=$1 [L,QSA]

Upvotes: 1

Halcyon
Halcyon

Reputation: 57729

My advice for any kind of rewrite rules that intend some form of semantic URLs, that is:

/home

instead of

index.php?page=home

Make one rule that captures all URLs, like:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ handler.php?__url=$1 [QSA]

Then have handler.php figure out what you want to do.

You know your categories and products, so if the URL is /[product|category] then handle it.

Upvotes: 2

Related Questions