1

我已经将我的博客从一个 CMS/博客系统切换到使用具有一些默认 Apache 重写规则的 Habari,我正在尝试将所有旧文章 URL 从 重定向/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]

我的 URL 重写附加到 Habari 重写规则的末尾

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

3 回答 3

1

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

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

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

于 2013-04-30T22:38:10.503 回答
1

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

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

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

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

在 .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]

类似于您问题中的规则。

于 2013-05-01T03:53:58.160 回答
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 RewriteRule 主题 Logging Comments top Logging

mod_rewrite 在 trace1 到 trace8 日志级别提供其操作的详细日志记录。可以使用 LogLevel 指令专门为 mod_rewrite 设置日志级别:直到级别调试,不记录任何操作,而 trace8 意味着实际上所有操作都被记录。

对 mod_rewrite 使用高跟踪日志级别会显着降低 Apache HTTP 服务器的速度!使用高于 trace2 的日志级别仅用于调试!例子

LogLevel 警报重写:trace3 RewriteLog

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

于 2015-03-10T13:05:20.897 回答