我(有时)以某种方式设法成功地重写网址,但我想了解我实际做的核心。
现在,每当我在浏览器的地址栏中键入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应该是一样的吗?我真的不知道他们是否使用不同的引擎,但这对我来说是合乎逻辑的。所以,假设我是对的,当我从RewriteCond
和RewriteRule
删除'.php'时,为什么第二个例子不起作用?另外,如果我有机会打印htaccess的REQUEST_URI,它会在上面的示例中实际打印到屏幕上吗?
答案 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