Reputation: 39389
I have a cascade problem with my .htaccess rules. Consider the following:
RewriteEngine on
RewriteRule ^product/(.*)$ product.php [L,QSA]
RewriteRule ^(.*)$ index.php [L]
With the above, if I requested a URL like http://example.com/product/product-slug, then I’d expect the request to get routed to product.php. However, it doesn’t; my index.php script is picked the request up.
I would have thought that the first RewriteRule
would be matched, and as it has a L
(last) flag that no further RewriteRule
s would be matched, including the “catch-all” one at the bottom.
Why is this not working as expected?
Upvotes: 0
Views: 141
Reputation: 331
This should sort it:
RewriteRule ^product/(.*)$ product.php [L,QSA]
RewriteCond %{REQUEST_FILENAME} !product.php
RewriteRule ^.*$ index.php [L]
The problem is that because the rules were in different sets, i.e. not attached a condition, it only stopped processing the current set of rules (the first one) and jumped onto the second.
Hope that clears it all up :)
Upvotes: 2
Reputation: 833
Is it not because of the order you have placed the rules in? The one below will override changes to the one above it. Try changing them around.
Also, do you need to set the RewriteBase or not? Is your project on an actual domain, or locally stored in a sub-directory of the server root?
Upvotes: 0
Reputation: 111
Perhaps a typo in your code? You're writing "http://example.com/products/" in your question, but in the code you're targeting ^product$
, with no s.
Also, your first rule is too strict. It will only match http://example.com/product/. You need to include a wild card after product to allow it to pick up product-slug. Something like RewriteRule ^products/(.*)$ product.php [L,QSA]
should work.
Upvotes: 1