高级htaccess重定向

时间:2015-04-05 07:46:28

标签: apache .htaccess http mod-rewrite web

使用mod_rewrite,我有一系列服务器端重定向(意味着客户端没有意识到URI更改。)我想这样做,以便任何客户端对index.php的引用返回404错误不会中断服务器端请求...

-

实施例..

客户端请求x.html,它加载index.php的内容..

客户端请求index.php,客户端获取404 Not Found错误..

-

我知道这个形成得很差,可能会解释得更好但是我希望这个解释得很好 - 如果不是,我道歉......

-

我在google上花了最后三个小时,试图找到解决方案,并且因为我真的不知道它会被理解为什么而变得简短......

2 个答案:

答案 0 :(得分:2)

答案取决于您的具体情况:如果您在.htaccess<Directory>,这很容易:

RewriteEngine On
RewriteRule  /index.php     -           [L,R=404]
RewriteRule  /x.html        /index.php  [L]

如果您在.htaccess<Directory> ,则会再次处理该请求,请参阅here。 我使用了一个环境变量来解决这个问题:

RewriteEngine On
# after an internal redirect, the variable is prefixed with REDIRECT_
RewriteCond %{ENV:REDIRECT_redirect_to_php} !=true
# no leading / this time
RewriteRule  index.php     -           [L,R=404]
RewriteRule  x.html        /index.php  [L,E=redirect_to_php:true]

您可以使用RewriteLogRewriteLogLevel来获取重写执行的详细信息。

答案 1 :(得分:0)

也许[END]标签就是您要搜索的内容。正如David所说,问题是请求是第二次处理。据我所知,你可以使用[END]来防止这种行为。请参阅https://stackoverflow.com/a/286005/4751174(在答案的最后)或mod_rewrite doc:

  

使用[END]标志不仅终止当前轮次的重写处理(如[L]),还会阻止在每个目录(htaccess)上下文中发生任何后续重写处理。   http://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_end

需要Apache 2.3.9或更高版本。