Roi
Roi

Reputation: 1647

ExpressionEngine RewriteRule RegEx Throws 500 Error

When using categories in ExpressionEngine, a Category URL Indicator trigger word can be set to load a category by its {category_url_title}.

I would like to remove the category "trigger word" from the URL.

Here is what I have so far, with the trigger word set to "category":

RewriteRule /products/(.+)$ /products/category/$1 [QSA,L]

I'm not an expert at writing regular expressions, but I do a little. I'm 99% sure my RegEx is fine, however when trying to use it as a RewriteRule in my .htaccess file, I'm getting a 500 error.

I'm sure it's something stupid, but for some reason I'm not seeing my mistake. What am I doing wrong?


Update: Adding a ^ to the beginning of the RewriteRule fixed the 500 error.

RewriteRule ^/products/(.+)$ /products/category/$1 [QSA,L]

Upvotes: 0

Views: 677

Answers (2)

rjb
rjb

Reputation: 9116

This Apache RewriteRule should do the job for you*:

RewriteCond %{REQUEST_URI} ^/products/(?!category/)
RewriteRule ^/products/(.*) /products/category/$1 [L]

With this in place, you'll need to hard code your category links manually:

{categories backspace="2"}
    <a href="{site_name}/products/{category_url_title}">{category_name}</a>,
{/categories}

Which would output the new Category URLs you desire:

http://example.com/products/toys

Otherwise, if using the recommended path variable when building your category links:

{categories backspace="2"}
    <a href="{path=products/index}">{category_name}</a>,
{/categories}

Would create links with the Category URL Indicator in the URI:

http://example.com/products/C1
http://example.com/products/category/toys

Which — while perfectly valid — would create canonicalization issues on your site since the different URLs would appear as duplicate content to search engines.


*Credit to fge for brilliant mod_write rule.

Upvotes: 0

fge
fge

Reputation: 121780

This is not safe. Take:

/products/a

The regex group matches a.

It will be rewritten to:

/products/category/a

which the regex matches again (this time, the group matches category/a). Guess what will happen.

You want /products/ from the beginning of input if it is not followed by category/, which means you want a negative lookahead. Also, the QSA flag is of no use, you don't have a query string to rewrite (QSA stands for Query String Append):

RewriteRule ^/products/(?!category/)(.+) /products/category/$1 [L]

Another way to use it (and which I personally prefer) is to use a RewriteCond prior to the rule:

RewriteCond %{REQUEST_URI} ^/products/(?!category/)
RewriteRule ^/products/(.*) /products/category/$1 [L]

Upvotes: 3

Related Questions