我的RewriteRule中的正则表达式是可以的,但.htaccess不起作用

时间:2012-09-20 01:44:30

标签: regex apache .htaccess

让我的.htaccess ReWrite在我的apache web服务器上运行时遇到了很多麻烦。我已经阅读了几个教程并测试了我的正则表达式与Grep匹配。

以下是代码:

    RewriteRule \?action=viewArticle&articleId=([0-9]*)&categoryId=([0-9])$ essays/$1 [R=301,L]

这是我想要匹配的网址:

http://mysite.com/?action=viewArticle&articleId=15&categoryId=1

并改为

http://mysite.com/essays/15

更新:解决方案!来自Jon的excellent tutorial。我将<base href="/">放在头文件中以使css正常工作非常重要。

最终重写看起来像这样:

RewriteCond %{THE_REQUEST} /?action=viewArticle&articleId=([0-9]*)&categoryId=([0-9])
RewriteRule ^$ /essays/%1? [R=301,L,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^essays/([0-9]+) /?action=viewArticle&articleId=$1&categoryId=([0-9]) [L]

1 个答案:

答案 0 :(得分:2)

您无法匹配RewriteRule中的主机或查询字符串,您需要与%{HTTP_HOST}指令中的%{QUERY_STRING}RewriteCond变量匹配:

RewriteCond %{HTTP_HOST} mysite\.com$ [NC]
RewriteCond %{QUERY_STRING} ^action=viewArticle&articleId=([0-9]*)&categoryId=([0-9])$
RewriteRule ^$ /essays/%1? [L,R=301]

当有人转到http://mysite.com/?action=viewArticle&articleId=15&categoryId=1http://mysite.com/essays/15时,会重定向浏览器(更改地址栏中的网址)

如果您的htaccess文件仅为单个主机提供服务,则不需要%{HTTP_HOST}条件。