ExpressionEngine RewriteRule RegEx引发500错误

时间:2012-01-03 07:04:31

标签: regex .htaccess mod-rewrite expressionengine

在ExpressionEngine中使用类别时,可以设置Category URL Indicator 触发词以按其{category_url_title}加载类别。

我想从网址中删除“触发词”类别。

这是我到目前为止所拥有的,触发词设置为“category”:

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

我不是编写正则表达式的专家,但我做了一点。我99%确定我的RegEx没问题,但是当我在.htaccess文件中尝试将其用作RewriteRule时,我收到500错误。

我确定这是愚蠢的,但由于某种原因,我没有看到我的错误。我做错了什么?


更新:在RewriteRule的开头添加^修复了500错误。

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

2 个答案:

答案 0 :(得分:3)

这不安全。取:

/products/a

正则表达式组匹配a

它将被重写为:

/products/category/a

正则表达式再次匹配 (这次,该组匹配category/a)。猜猜会发生什么。

如果输入后面没有/products/ ,则需要category/,这意味着您需要一个负向前瞻。此外,QSA标志没有用,您没有要重写的查询字符串(QSA代表查询字符串追加):

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

使用它的另一种方式(我个人更喜欢)是在规则之前使用RewriteCond

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

答案 1 :(得分:0)

这个Apache RewriteRule应该为你做的工作*:

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

有了这个,你需要手动硬编码你的类别链接:

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

哪个会输出您想要的新类别网址:

http://example.com/products/toys

否则,如果在构建类别链接时使用推荐的path variable

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

将在URI中创建与Category URL Indicator的链接:

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

哪个 - 虽然完全有效 - 会在您的网站上创建canonicalization issues,因为不同的网址会显示为搜索引擎的重复内容。


*感谢fge精彩的mod_write规则。