1

我的 htdocs 中有这个设置:

htdocs
htdocs/somedir
htdocs/somedir/process.php
htdocs/somedir/.htaccess

这是 .htaccess 代码:

RewriteEngine on
RewriteRule ^([^/]*)$ process.php?var=$1 [L]

我相信这条规则告诉 apache 从最右边的字母开始并继续存储它,除非它遇到一个/So, in URL http://127.0.0.1/somedir/foo, $1should be foo。对?

但是当我去这个 URL:http://127.0.0.1/somedir/foo时,一个 print_r($_GET) inprocess.php输出这个:

Array
(
    [var] => process.php
)

而我希望它应该这样说:

Array
(
    [var] => foo
)

那么为什么是var的价值是process.php而不是foo呢?如何编写此重写规则以var获取值foo

旁注:无论我是否将此process.php&移动.htaccess到根目录或任何第二/第三/第四级,所有适当的 URL 都会产生相同的结果:

像:

http://127.0.0.1/foo             //process.php & .htaccess in root
http://127.0.0.1/somedir/foo     //process.php & .htaccess in htdocs/somedir
http://127.0.0.1/somedir/2nd/foo //process.php & .htaccess in htdocs/somedir/2nd

更新01:

我注意到$_SERVER["REDIRECT_QUERY_STRING"]等于var=foo,而$_SERVER["QUERY_STRING"]var=process.php

4

1 回答 1

2

乍一看,我会说您在重写规则中的正则表达式有问题。尝试从

RewriteEngine on
RewriteRule ^([^/]*)$ process.php?var=$1 [L]

RewriteEngine on
RewriteRule ([^/]+)$ process.php?var=$1 [L]

如果您将它锚定在字符串的开头(“^”),则它无法匹配,因为字符串中有一个“/”。


在每个目录级别上使用 RewriteRules 稍微复杂一些。REQUEST_URI 可能不是您所期望的,因此某些规则会产生意想不到的结果。但是,在 RewriteConditions 中引用匹配项时,您通常可以解决问题。在这种情况下:

RewriteEngine on
RewriteCond %{THE_REQUEST} "([^/]+) HTTP"   
RewriteRule ^ process.php?var=%1 [L]

(注意规则中的 '%' 而不是 '$')

于 2012-07-28T09:16:52.907 回答