【问题标题】:Apache Rewrite Rule with Habari Default Rewrites具有 Habari 默认重写的 Apache 重写规则
【发布时间】:2015-03-10 21:05:20
【问题描述】:

我已经将我的博客从一个 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]

【问题讨论】:

    标签: mod-rewrite url-rewriting apache2 habari


    【解决方案1】:

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

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

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

    【讨论】:

    • 给了你一个正确答案的投票,但这是我之前尝试过的地方之一,我再次尝试了仍然没有,我无法弄清楚为什么它不起作用,不过谢谢。跨度>
    【解决方案2】:

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

    你的规则: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]
    

    类似于您问题中的规则。

    【讨论】:

    • 非常感谢您的回复,但对我来说仍然无法正常工作。我已经发现 / before 文章需要删除。
    • .htaccess 文件在哪里,错误或问题是什么?确保在任何测试之前清除浏览器的缓存。
    • 据我在martinmelin.se/rewrite-rule-tester 的测试可以看出,它们应该可以工作,尝试清除缓存和所有内容,但仍然不行。任何更多的想法都非常感谢。
    • 一个愚蠢的:你的代码在修改之前工作了吗?还有更多规则吗?再一次,您面临的错误或问题是什么?如果不知道问题出在哪里,什么也说不出来。
    • 请在评论中复制并粘贴完整的测试和重定向 URL。
    【解决方案3】:

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

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

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

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

    指令 重写库 重写条件 重写引擎 重写映射 重写选项 重写规则 话题 日志记录 注释 最佳 日志记录

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

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

    LogLevel 警报重写:trace3 重写日志

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-02
      • 2011-10-26
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多