【问题标题】:regex in my RewriteRule is OK, but .htaccess does not work我的 RewriteRule 中的正则表达式没问题,但 .htaccess 不起作用
【发布时间】:2012-09-20 12:38:11
【问题描述】:

让我的 .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

更新:解决方案!来自乔恩的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]

【问题讨论】:

    标签: regex apache .htaccess


    【解决方案1】:

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

    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=1 转到http://mysite.com/essays/15 时,这会重定向浏览器(更改地址栏中的 URL)

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

    【讨论】:

    • 哇,谢谢@Jon。这几乎可以工作,问题是现在 a) 它将我发送到 mysite.com/essays/… 并且 b) 它生成一个错误页面
    • @Dave 抱歉,我在/essays/%1 之后省略了?。这将删除查询字符串。至于错误页面,您得到的错误是什么?是找不到 (404) 还是服务器错误 (500)?
    • @ Jon,没问题,非常感谢您的帮助。 ? 修复问题一。错误是未找到
    • @Dave 所以如果你在你的 URL 地址栏中输入http://mysite.com/essays/15,那不会返回 404?
    • @Dave 但是在您的问题中,您希望将上述内容重定向到http://mysite.com/essays/15,为什么要将其重定向到不存在的资源(或没有任何服务方式请求)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 2013-12-14
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多