【发布时间】: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