How to rewrite this URL:
https://example.com/illustrations.php?category=cats&cat_id=1
to:
https://example.com/category/cats
also, how do I still preserve cat_id
param?
I tried this but it does not work:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/?category/(.*?)/?$ /illustrations.php?category=$1 [L]
Advertisement
Answer
When I add this code and go to
illustrations.php?category=cats
it does not change the URL in the browserbar.
Yes, that is “correct”.
The code you posted internally rewrites the URL /category/cats
(which is the URL you should be linking to in your HTML source) back to the actual filesystem/URL path: /illustrations.php?category=cats
. This is required in order to make the “pretty” URL /category/cats
“work”.
You can’t change the URL structure using .htaccess
only – if that is what you are implying. You do need to actually change the physical URLs in your HTML source.
You could implement an external redirect (not a rewrite) from /illustrations.php?category=cats
to the canonical URL /category/cats
using .htaccess
, but note that this is only to benefit SEO (and third parties that might have already linked to the old URLs). This is a necessary additional step if you are changing an existing URL structure and SEO is a concern, but it is not part of the “working” of your site.
how do I still preserve
cat_id
param
You would need to include the value of the cat_id
parameter in the URL. eg. /category/cats/1
(as @arkascha suggested in comments) or /category/1/cats
– depending on which value is more important. I would put the more important value first, since URLs can be accidentally cropped when shared.
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/?category/(.*?)/?$ /illustrations.php?category=$1 [L]
This rule could be simplified. Filesystem checks are relatively expensive. It looks like you could remove both of these by making your regex more specific. eg. Could /category/1/cats
ever map to a file? Do you need directories to be accessible? I would expect the answer to both those questions is “no”.
I would also decide on whether to allow trailing slashes or not, rather than allowing both (as in your current rule). Strictly speaking this creates duplicate content (two URLs; same content), so requires additional steps to resolve. Your example URL(s) do not contain a trailing slash.
So, you could simplify your rules to the following in order to rewrite /category/1/cats
(no trailing slash) to /illustrations.php?category=cats&cat_id=1
RewriteEngine On RewriteRule ^category/(d+)/([w-]+)$ /illustrations.php?category=$2&cat_id=$1 [L]
This assumes cat_id
can be 1 or more digits (0-9
). And category
is limited to the following characters: a-z
, A-Z
, 0-9
, _
(underscore), -
(hyphen).
With regex it is preferable to be as restrictive as possible. By omitting the dot (.
) from the last path segment in the above rule it cannot match a physical file (assuming all your files have file extensions).