我已经将我的博客从一个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]
答案 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'[重写:'