htaccess url重写了对request_uri的困惑

时间:2011-11-19 13:58:32

标签: php .htaccess

我(有时)以某种方式设法成功地重写网址,但我想了解我实际做的核心。

现在,每当我在浏览器的地址栏中键入http://localhost/admin/shop/时,我都希望我的htaccess将网址重写为http://localhost/admin.php?page=shop,所以在php中我可以理解我实际上是在处理商店页。为此,我有:

RewriteEngine on
RewriteRule ^(.*)\$ $1.php [nc]

RewriteCond %{REQUEST_URI} ^/admin\.php/[^/]+/$
RewriteRule ^admin\.php/(.*)/$ admin\.php?pval=$1 [l,nc]

到目前为止这是有效的。但我想了解为什么我的代码在我执行此操作时无效:

###RewriteEngine on
###RewriteRule ^(.*)\$ $1.php [nc]

### note the commenting out the code above    

RewriteCond %{REQUEST_URI} ^/admin/[^/]+/$
RewriteRule ^admin/(.*)/$ admin?pval=$1 [l,nc]

### note the removal of '\.php' 

所以基本上,当你在地址栏输入'http:// localhost / admin / shop /'时,php的$_SERVER['REQUEST_URI']会打印出/ admin / shop /。现在,假设php的REQUEST_URI是这样的,htaccess REQUEST_URI应该是一样的吗?我真的不知道他们是否使用不同的引擎,但这对我来说是合乎逻辑的。所以,假设我是对的,当我从RewriteCondRewriteRule删除'.php'时,为什么第二个例子不起作用?另外,如果我有机会打印htaccess的REQUEST_URI,它会在上面的示例中实际打印到屏幕上吗?

PS:我知道在这种情况下,我真的不需要使用htaccess,因为我可以在admin文件夹中创建一个文件夹,并将其命名为shop等等。但问题是我没有管理员文件夹,因为我在admin.php中使用控制器和一个简单的开关,以避免在我的应用程序中创建数百万个文件夹。这对我来说更简单。

3 个答案:

答案 0 :(得分:5)

§

您修改的规则不起作用的原因可能是因为您从url-path中省略了.php。假设您在根中托管了admin.php文件,这应该可以工作:

RewriteCond %{REQUEST_URI} ^/admin/[^/]+/$
RewriteRule ^admin/(.*)/$ /admin.php?pval=$1 [L,NC]

§

删除此

RewriteRule ^(.*)\$ $1.php [nc]

可能没有引起任何问题,因为它可能不匹配任何东西。该模式以转义的美元符号\$结束,该符号与$字符匹配,而不与end of line元字符匹配。因此该规则匹配包含美元符号的任何路径。

§

Apache的%{REQUEST_URI}变量是否与PHP的$_SERVER['REQUEST_URI']相同?

或多或少。但是,例如,如果您使用重定向进行任何重写,您可能会感到困惑,因为重定向将创建一个新的重写请求。这是一个似是而非的例子,但可能还有其他高级用例需要注意。对于简单的情况,它们是相同的。

答案 1 :(得分:2)

只是想一想,我认为最后一个斜杠不会让它与.php文件匹配,即:http://localhost/admin/shop是否会为您提供与http://localhost/admin/shop/相同的页面?

尝试将其更改为:

RewriteRule ^admin/(.*)$ admin\.php?pval=$1 [l,nc]

答案 2 :(得分:1)

如果您使用.htaccess文件来执行mod_rewrite优点,则REQUEST_URI没有开头斜杠,例如/ admin / shop / - >管理员/店铺/

要“调试”mod_rewrite,你必须在conf文件中设置“RewriteLog”指令,如下所示:

RewriteLog "C:/wamp/logs/rewrite.log"
RewriteLogLevel 9