【问题标题】:.htaccess Rewrite Rule not affecting GET on page.htaccess 重写规则不影响页面上的 GET
【发布时间】:2014-01-09 17:03:42
【问题描述】:

示例代码

这是我的.htaccess 文件的示例:

RewriteEngine On

RewriteRule ^home/?$                index.php?intro=true [L]
RewriteRule ^home/([^/]*)$      index.php?location=$1&intro=true [L]

RewriteRule ^wedding/?$             wedding.php [L]
RewriteRule ^wedding/([^/]*)$       wedding.php?location=$1 [L]

下面是index.phpwedding.php 页面上的一些示例代码:

index.php:

if(!$_GET["location"]) { $location = "London"; } else { $location = ucwords($_GET["location"]); }

[....]

<h1>Ben Pearl, <?php echo $location; ?> Magician</h1>

wedding.php:

if(!$_GET["location"]) { $location = "London"; } else { $location = ucwords($_GET["location"]); }

....

<h1><?php echo $location; ?> Wedding Magician</h1>

应该发生什么

$location 字符串应受$_GET 值“location”的影响。

发生了什么

重写在index.php 上运行良好;如果用户访问 example.com/home/place,$location 将替换为 place

但是,在每隔一个页面(包括上面粘贴了脚本的页面)上,字符串都被替换为“london”,这意味着该页面没有收到$_GET 数据并且重写规则无法正常工作。

奇怪的是,完全相同的代码在我的localhost 上运行良好。

【问题讨论】:

  • 为了百分百确定,您是否尝试过在脚本顶部使用var_dump($_GET) 来查看$_GET 数组中的确切内容?然后你可以肯定地说位置键不存在
  • 是的。我把它放在任何 HTML 之前,它返回了 array(0) { };在主页上我看到array(2) { ["location"]=&gt; string(6) "place" ["intro"]=&gt; string(4) "true" }
  • 您可以发布一个无效的网址/路径(/wedding/...)吗?
  • 是的,我在上面发布了(array(0) { })(抱歉,不清楚!)

标签: php apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

尝试关闭 Multiviews,这会打开 mod_negotiation 的“模糊”请求 URI 到文件映射。当 mod_negotiation 看到 /wedding/ 然后它看到有一个文件 /wedding.php 时,它会启动并直接在那里发送请求,完全绕过 mod_rewrite 和你的规则。

在您的 htaccess 文件顶部,添加:

Options -Multiviews

这也可以解释为什么它适用于对index.php 的重写,因为/home 看起来不像/index.php(而如果你有一个home.php,mod_negotiation 会尝试映射到那个) .

【讨论】:

  • +1,你知道我曾经做过一些严重的 apache 黑客攻击,但我从来没有想过为什么我总是自动在我的配置中输入 -Multiviews。怀疑我会在我的生活中使用它,但学习新事物总是很好:)
猜你喜欢
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2023-03-31
  • 2021-02-09
  • 2013-07-11
相关资源
最近更新 更多