2016-12-30 133 views
3

我正在重新构建我的私人博客。我现在想使用PHP的主机。但是,我想隐藏.php扩展名,并使用.html代替。另一方面,主机需要重写.php以实际运行脚本。所以我想:将.php重定向到.html,在.htaccess中将.html内部重写为.php

  1. 外部重定向一个.php到相应.html URL的任何请求,所以用户不会“看”到PHP URL。

  2. 在内部将.html文件的任何请求重写为.php文件名以执行实际的PHP脚本。

据我所知,主机使用Apache与mod_rewrite。

基本上我觉得我需要的是:

RedirectEngine On 
RedirectMatch 301 ^(.*).php$ $1.html 
RewriteRule ^(.*).html$ $1.php [L] 

不过,我得到一个无限重定向循环到.html文件。就好像RewriteRule再次自动触发RedirectMatch一样。 我也试过的RewriteRuleRewriteCondRewriteBase代替RedirectMatch各种组合,但随后重定向通常去一些主控器内部的目录结构(如/bla/foo/user/xyz/.../file.html),并RedirectBase显示没有影响。

任何帮助表示赞赏!

回答

2

对于这样的事情,你只需要使用mod_rewrite。 RedirectMatch是一个mod_alias指令,因此可能会导致冲突(不同的模块在不同的时间运行,尽管配置文件中有明显的顺序)。无论如何,你仍然需要小心重定向/重写循环。

# 1. Externally redirect `.php` requests to `.html` 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^(.+)\.php$ /$1.html [R=302,L] 

RewriteCond指令,检查针对REDIRECT_STATUS环境变量防止被重定向重写 URL(这将导致重定向循环)。 REDIRECT_STATUS在第一次重写后(下),设置为“200”(200 OK HTTP状态)。

当您确定工作正常时,将302(临时)重定向到301。 301s被浏览器强制缓存,因此可能会使测试出现问题。

然后,执行内部,就像你收到了(记得要逃脱点以匹配字面点):

# 2. Internally rewrite `.html` to `.php` 
RewriteRule ^(.+)\.html$ $1.php [L] 

仿佛RewriteRule再次自动触发RedirectMatch

是的,这确实发生(原因上面RewriteCond指令)。当URL被重写/改变时,整个过程将重复,直到URL通过不变。

但重定向则通常去一些主机托管服务提供商内部的目录结构

当您尝试重定向到一个相对路径在每个目录(即.htaccess)背景下会出现这种情况。目录前缀(内部目录文件系统路径)在重写的URL上加上前缀。对于外部重定向,您需要指定绝对或相对URL。

RedirectBase显示没有效果。

那么,RewriteBase指令将解决上述重定向到相对路径的问题。 RewriteBase指令有效地更改添加回相对路径替换的目录前缀。这就是它所做的一切。如果你不使用相对路径替换,那么它不起作用。