繁体   English   中英

Apache mod_rewrite查找foo.php

[英]Apache mod_rewrite looks for foo.php

我正在尝试遵循mod_rewrite教程,但无法获得一个特定的示例。 我启用了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

我四处看看,发现如何记录 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+)/?$那么它将起作用。 我不明白的是为什么当href不包含.php ,Apache为什么要寻找user.php ,请参见下文。

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

谁能解释一下如何使Apache查找user/bob

另外,如果可能的话,有人可以解释为什么会这样吗?

似乎在应用mod_rewrite 之前,多视图已将“用户”与“ user.php”匹配。 尝试将其关闭:

Options -Multiviews

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM