Apache 通过附加.html后缀重写URL
我正在尝试使用Apache 2.4的mod_rewrite来附加后缀Apache 通过附加.html后缀重写URL,apache,.htaccess,mod-rewrite,apache2.4,Apache,.htaccess,Mod Rewrite,Apache2.4,我正在尝试使用Apache 2.4的mod_rewrite来附加后缀.html来请求URI 应该重写的URI非常简单,其形式如下: http://host.domain/page/ 以上内容需要重写为http://host.domain/page.html。唯一的限制是重写逻辑必须忽略引用实际文件或目录的URI 到目前为止,如果没有尾随斜杠,我提出的重写代码段可以正常工作,但是如果存在尾随斜杠,Apache会发出404和以下错误消息: 在此服务器上找不到请求的URL/redirect:/abou
.html
来请求URI
应该重写的URI非常简单,其形式如下:
http://host.domain/page/
以上内容需要重写为http://host.domain/page.html
。唯一的限制是重写逻辑必须忽略引用实际文件或目录的URI
到目前为止,如果没有尾随斜杠,我提出的重写代码段可以正常工作,但是如果存在尾随斜杠,Apache会发出404和以下错误消息:
在此服务器上找不到请求的URL/redirect:/about.html。
(当URI为http://localhost/about/
)
有人能帮我调试一下吗?为什么Apache会预编/redirect:
下面是一个非常简单的片段,它再现了这些症状:
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]
您可以使用:
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\u ROOT}/$1\.html-f
来确保相应的html文件存在。