通过附加 .html 后缀重写 URL

Posted

技术标签:

【中文标题】通过附加 .html 后缀重写 URL【英文标题】:Rewriting URL by appending .html suffix 【发布时间】:2015-11-30 13:06:06 【问题描述】:

我正在尝试在 Apache 2.4 中使用 mod_rewrite 来附加后缀 .html 来请求 URI。

应该重写的 URI 非常简单,格式如下:

http://host.domain/page/

以上需要重写为http://host.domain/page.html。唯一的限制是重写逻辑必须忽略引用实际文件或目录的 URI。

到目前为止,如果 没有尾随斜杠,我想出的重写 sn-p 工作正常,但是如果存在斜杠,Apache 会发出 404 和以下错误消息:

The requested URL /redirect:/about.html was not found on this server.

(当URI为http://localhost/about/时会发生上述情况)

有人可以帮我调试一下吗?为什么 Apache 在前面加上 /redirect:

这是一个重现症状的非常简单的 sn-p:

RewriteEngine on

RewriteBase /

RewriteRule ^(.+[^/])/$ /$1 [C]

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_URI !^$
RewriteRule (.*) /$1.html [L,R=301] # Tried without R=301 too

# This doesn't work either.
# RewriteRule ^about/$ /about.html [L,R=301]

【问题讨论】:

【参考方案1】:

你可以使用:

RewriteEngine on
RewriteBase /

# strip trailing slash from non-directoies
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.+?)/$ /$1 [L,R=301]

# make sure corresponding html file exists
RewriteCond %DOCUMENT_ROOT/$1\.html -f
RewriteRule ^(.+?)/?$ $1.html [L]

【讨论】:

你能解释一下我上面哪里出错了吗?例如,为什么不链接第一条规则以删除尾部斜杠? 第一条规则中不需要使用C标志,最好使用RewriteCond %DOCUMENT_ROOT/$1\.html -f来确保对应的html文件存在。

以上是关于通过附加 .html 后缀重写 URL的主要内容,如果未能解决你的问题,请参考以下文章

如何使用标准 unix 命令将后缀附加到 HTML 文件中的 id?

Seesion

使用变量将日期附加到 HTML 重定向 URL

如何将查询参数附加到现有 URL?

通过 facebook 登录会附加一些代码来重定向 url

从 URL 获取图像并将其附加到数组