【问题标题】:Apache 2.4 RewriteRule only working with domain nameApache 2.4 RewriteRule 仅适用于域名
【发布时间】:2020-06-21 01:00:33
【问题描述】:

我正在将旧网站从 apache 2.2 迁移到 2.4

我有一个 vhost.conf 文件,其中包含以下重写规则:

RewriteRule ^/news/[0-9]{4}/[A-za-z]{3}/([0-9a-zA-Z-]*)/([0-9]{4})([0-9]{6})/?$ "/news/article.cfm?article_id=$3&urltitle=$1&clk=$2" [NE,L]

所以我想把这个网址: https://example.com/news/2016/Feb/Article-Title/0025012345

进入这个: https://example.com/news/article.cfm?article_id=012345&urltitle=Article-Title&clk=0025

根据我在 RewriteRule 的第二部分中输入的内容,我得到以下内容:

"https://example.com/news/article.cfm?article_id=$3&urltitle=$1&clk=$2" 这工作正常,但我不想指定主机名,因为它在 dev/staging/live 服务器上使用,所以 URL 会改变

"/news/article.cfm?article_id=$3&urltitle=$1&clk=$2" 这会抛出一个 404,它会显示在 access_log

"news/article.cfm?article_id=$3&urltitle=$1&clk=$2" 这会抛出一个 503,它会出现在 access_log

所以我知道我在规则的第一部分正确识别了 URL,并使用我的正则表达式获取了正确的组件,因为指定完整的域名显示了正确的 URL 操作。

我完全没有做相对重定向,我确信这个规则在 Apache 2.2 中有效

我正在使用以下软件:

CentOS Linux 版本 7.7.1908(核心)

服务器版本:Apache/2.4.6 (CentOS) 服务器搭建:2019年8月8日11:41:18

【问题讨论】:

    标签: apache mod-rewrite centos7


    【解决方案1】:

    显然,答案在手册中......我应该更详细地阅读:

    https://httpd.apache.org/docs/2.4/rewrite/remapping.html#old-to-new

    假设我们最近将页面 foo.html 重命名为 bar.html,现在想要提供旧 URL 以实现向后兼容性。但是,我们希望旧 URL 的用户甚至无法识别页面已重命名 - 也就是说,我们不希望在他们的浏览器中更改地址。

    RewriteEngine  on
    RewriteRule    "^/foo\.html$"  "/bar.html" [PT]
    

    这里的关键是[PT],它为我修复了它:

    RewriteRule ^/news/[0-9]{4}/[A-za-z]{3}/([0-9a-zA-Z-]*)/([0-9]{4})([0-9]{6})/?$ "/news/article.cfm?article_id=$3&urltitle=$1&clk=$2" [PT,NE,L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-06
      • 2018-04-19
      • 2020-06-29
      • 2017-09-08
      • 2016-04-20
      • 2014-07-06
      • 1970-01-01
      • 2017-02-14
      相关资源
      最近更新 更多