【问题标题】:Advanced htaccess Redirection高级 htaccess 重定向
【发布时间】:2015-06-09 21:40:40
【问题描述】:

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

--

例子..

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

客户端请求 index.php,客户端收到 404 Not Found 错误..

--

我知道这是不正确的,可能可以更好地解释,但我希望这解释得足够好 - 如果不是,我很抱歉......

--

我在谷歌上花了三个小时,试图找到解决这个问题的方法,但由于我真的不知道它会被理解为什么,所以我做不到......

【问题讨论】:

    标签: apache .htaccess http mod-rewrite web


    【解决方案1】:

    答案取决于您的上下文:如果您在.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 获取重写执行的详细信息。

    【讨论】:

    • 非常感谢!编辑:我在网站的根目录中,没有使用任何目录标签或类似的东西,但第一个选项仍然返回 404 试图加载 index.php
    【解决方案2】:

    也许 [END] 标记就是您要搜索的内容。正如大卫所说,问题是请求被第二次处理。据我了解,您可以使用 [END] 来防止这种行为。请参阅https://stackoverflow.com/a/286005/4751174(在答案末尾)或 mod_rewrite 文档:

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

    需要 Apache 2.3.9 或更高版本。

    【讨论】:

    • 我已经验证并接受了之前的答案。它以我想要的方式完全发挥作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2011-08-22
    • 2023-01-12
    • 1970-01-01
    • 2016-06-21
    • 2013-06-19
    相关资源
    最近更新 更多