Apache重写规则与Habari默认重写

时间:2013-04-30 15:07:43

标签: mod-rewrite url-rewriting apache2 habari

我已经将我的博客从一个CMS /博客系统切换到使用Habari,它有一些默认的Apache重写规则,我正在尝试将所有旧文章网址从/articles/article-name重定向到/article-name。下面我发布了我正在使用的URL重写以及Habari系统中包含的默认值,我认为这可能是一个放置问题。我的重写应该高于他们的吗?

Habari默认Apache Rwrites:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteBase /
RewriteRule . index.php [PT]
RewriteRule ^(system/(classes|handlers|locale|schema|$)) index.php [PT]

我的网址重写了Habari重写规则的结尾

RewriteRule ^/articles/(.*)$ /$1 [R=301,PT]

3 个答案:

答案 0 :(得分:1)

是的,您需要在订单中的特定位置插入规则:

...
RewriteBase /
RewriteRule ^/articles/(.*)$ /$1 [R=301,PT]
RewriteRule . index.php [PT]
...

这将允许您的旧URL被重写,然后Habari可以处理重写的请求。

答案 1 :(得分:1)

注意:我知道已经接受了一个答案,但也许这个答案可以解决您的问题:

  

您的规则:RewriteRule ^/articles/(.*)$ /$1 [R=301,PT]

如果规则在一个.htacces文件中,则它不起作用,因为:

  

“...因此,带有^ /的模式在每个目录上下文中永远不匹配......”(从Per-directory Rewrites中提取)

在.htaccess文件中使用时,规则应为:

RewriteRule ^articles/(.*)$ /$1 [R=301,PT]

但是,如果目录/articles不存在,则使用第一个规则,永远不会应用您的规则,因为第一个规则会创建新请求。

如果是这种情况,您必须将当前代码修改为:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteBase /

# Add next line if directory "/articles" doesn't exist. 
# If exists, the previous condition "%{REQUEST_FILENAME} !-d" 
# will exclude it from the rule. 
RewriteCond %{REQUEST_URI}  !/articles [NC]

RewriteRule . index.php [PT]

# Add new rule
RewriteRule ^articles/(.*) /$1 [R=301,PT,NC]

RewriteRule ^(system/(classes|handlers|locale|schema|$)) index.php [PT]

上述修改对主Apache配置文件中的代码也有效,但重写规则应为:

RewriteRule ^/articles/(.*) /$1 [R=301,PT,NC]

与你问题中的规则类似。

答案 2 :(得分:0)

描述:提供基于规则的重写引擎,以便动态重写请求的URL 状态:扩展 模块标识符:rewrite_module 源文件:mod_rewrite.c 摘要 mod_rewrite模块使用基于规则的重写引擎(基于PCRE正则表达式解析器)来动态重写请求的URL。默认情况下,mod_rewrite将URL映射到文件系统路径。但是,它也可以用于将一个URL重定向到另一个URL,或者用于调用内部代理提取。

mod_rewrite提供了一种使用无限数量规则来操纵URL的灵活而强大的方法。每个规则可以具有无限数量的附加规则条件,以允许您根据服务器变量,环境变量,HTTP标头或时间戳重写URL。

mod_rewrite在完整的URL路径上运行,包括path-info部分。可以在httpd.conf或.htaccess中调用重写规则。重写规则生成的路径可以包含查询字符串,也可以导致内部子处理,外部请求重定向或内部代理吞吐量。

详细的mod_rewrite文档中提供了更多详细信息,讨论和示例。

指令 RewriteBase 的RewriteCond RewriteEngine叙述 RewriteMap指令 RewriteOptions 重写规则 话题 记录 评论 最佳 登录

mod_rewrite提供了在trace1到trace8日志levels的记录的detailed记录。可以使用LogLevel指令专门为mod_rewrite设置日志级别:最多级别调试,不记录任何操作,而trace8表示几乎所有操作都被记录。

对mod_rewrite使用高跟踪日志级别会大大减慢Apache HTTP Server的速度!仅使用高于trace2的日志级别进行调试! 实施例

LogLevel警告重写:trace3 RewriteLog

那些熟悉早期版本的mod_rewrite的人无疑会寻找RewriteLog和RewriteLogLevel指令。此功能已完全被上面提到的新的每模块日志记录配置所取代。 要获取特定于mod_rewrite的日志消息,请通过grep管道日志文件: tail -f error_log | fgrep'[重写:'