【问题标题】:Apache mod_rewrite looks for foo.phpApache mod_rewrite 寻找 foo.php
【发布时间】:2014-04-20 12:53:30
【问题描述】:

我正在尝试关注mod_rewrite tutorial,但我无法获得特定的示例。我已启用 mod_rewrite,它适用于以下简单示例 .htaccess

# Redirect everything in this directory to "good.html" 
RewriteEngine on RewriteRule .* good.html

以下代码是我.htaccess的内容

# Enable Rewriting
RewriteEngine on

# Rewrite user URLs
#   Input:  user/NAME/
#   Output: user.php?id=NAME
RewriteRule ^user/(\w+)/?$ user.php?id=$1

我环顾四周,发现 how to log mod_rewrite 在做什么,我的日志显示以下信息

192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678 [rid#417c1518/subreq] (3) [perdir /var/www/] add path info postfix: /var/www/user.php -> /var/www/user.php/bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417c1518/subreq] (3) [perdir /var/www/] strip per-dir prefix: /var/www/user.php/bob -> user.php/bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417c1518/subreq] (3) [perdir /var/www/] applying pattern '^user/(\\w+)/?$' to uri 'user.php/bob'
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417c1518/subreq] (1) [perdir /var/www/] pass through /var/www/user.php
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417ae4d0/initial] (3) [perdir /var/www/] add path info postfix: /var/www/user.php -> /var/www/user.php/bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417ae4d0/initial] (3) [perdir /var/www/] strip per-dir prefix: /var/www/user.php/bob -> user.php/bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417ae4d0/initial] (3) [perdir /var/www/] applying pattern '^user/(\\w+)/?$' to uri 'user.php/bob'
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417ae4d0/initial] (1) [perdir /var/www/] pass through /var/www/user.php
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417bb500/subreq] (3) [perdir /var/www/] strip per-dir prefix: /var/www/bob -> bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417bb500/subreq] (3) [perdir /var/www/] applying pattern '^user/(\\w+)/?$' to uri 'bob'
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417bb500/subreq] (1) [perdir /var/www/] pass through /var/www/bob

所以我从日志中了解到正则表达式不匹配,因为它与user.php/bob 而不是user/bob 进行比较。如果我将重写规则更改为^user.php/(\w+)/?$,那么它就可以工作。我不明白为什么 Apache 在 href 不包含 .php 时寻找 user.php,见下文。

<a href="user/bob">user/bob</a>

谁能解释如何让 Apache 寻找user/bob

另外,如果可能的话,谁能解释为什么会发生这种情况?

【问题讨论】:

  • 这就是你的 htaccess 中的一切吗?
  • 是的,我只是直接从教程中提取出来的。
  • 如果把规则改成RewriteRule ^user/(\w+)/?$ user.php?id=$1 [R],在url中会显示什么?
  • 它只显示192.168.1.64/user/bob。如果我理解正确,将在匹配后应用该标志。我遇到的问题是在检查匹配之前。

标签: php apache .htaccess mod-rewrite


【解决方案1】:

看起来多视图正在匹配“user”到“user.php”之前 mod_rewrite 甚至被应用。尝试将其关闭:

Options -Multiviews

Multiviews 是 mod_negotiation 的一部分,它尝试通过查找类似名称的文件(如减去扩展名的文件)来“猜测”请求的文件。它在 mod_rewrite 之前应用,因此它会绕过您的重写规则。

【讨论】:

  • 谢谢。我将该代码添加到.htaccess,它现在可以按我的预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2014-09-20
  • 2015-07-04
相关资源
最近更新 更多