我(有时)以某种方式设法成功地重写网址,但我想了解我实际在做的核心.
现在,每当我输入http://localhost/admin/shop/浏览器的地址栏时,我都希望我的htaccess重写url,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]
Run Code Online (Sandbox Code Playgroud)
这项工作到目前为止.但我想了解为什么我的代码在我执行此操作时不起作用:
###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'
Run Code Online (Sandbox Code Playgroud)
所以基本上,当你在地址栏输入'http:// localhost/admin/shop /'时,php $_SERVER['REQUEST_URI']会打印出完全/ admin/shop /.现在,假设php REQUEST_URI是这样的,htaccess REQUEST_URI应该是一样的吗?我真的不知道他们是否使用不同的引擎,但这对我来说是合乎逻辑的.所以,假设我是对的,当我从RewriteCond和删除'.php'时,为什么第二个例子不起作用RewriteRule?另外,如果我有机会打印htaccess的REQUEST_URI,它会在上面的示例中实际打印到屏幕上的内容是什么?
PS:我知道在这种情况下,我真的不需要使用htaccess,因为我可以在admin文件夹中创建一个文件夹,并将其命名为shop等等.但问题是我没有管理员文件夹,因为我在admin.php中使用控制器和一个简单的开关,以避免在我的应用程序中创建数百万个文件夹.这对我来说更简单.
修改后的规则不起作用的原因可能是因为您.php从url-path中省略了它.假设您admin.php在根中托管了一个文件,这应该可行:
RewriteCond %{REQUEST_URI} ^/admin/[^/]+/$
RewriteRule ^admin/(.*)/$ /admin.php?pval=$1 [L,NC]
Run Code Online (Sandbox Code Playgroud)
删除它
RewriteRule ^(.*)\$ $1.php [nc]
Run Code Online (Sandbox Code Playgroud)
可能没有引起任何问题,因为它可能没有匹配任何东西.该模式以转义的美元符号结束,该符号\$与$字符匹配,而不是end of line元字符.因此该规则匹配包含美元符号的任何路径.
Apache的%{REQUEST_URI}变量是否与PHP相同$_SERVER['REQUEST_URI']?
或多或少.但是,例如,如果您使用重定向进行任何重写,您可能会感到困惑,因为重定向将创建一个新的重写请求.这是一个似是而非的例子,但可能还有其他高级用例需要注意.对于简单的情况,它们是相同的.
小智 1
如果您使用 .htaccess 文件来执行 mod_rewrite 功能,则 REQUEST_URI 没有开头斜杠,因此例如 /admin/shop/ -> admin/shop/
要“调试”mod_rewrite,您必须在conf文件中设置“RewriteLog”指令,如下所示:
RewriteLog "C:/wamp/logs/rewrite.log"
RewriteLogLevel 9
Run Code Online (Sandbox Code Playgroud)