【问题标题】:htaccess url rewrite confusion about request_urihtaccess url重写关于request_uri的混淆
【发布时间】:2011-11-19 13:58:31
【问题描述】:

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

现在,每当我在浏览器的地址栏输入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]

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

###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 中的一个简单开关,以避免在我的应用程序中创建数百万个文件夹。这对我来说更简单。

【问题讨论】:

    标签: php .htaccess


    【解决方案1】:

    §

    您修改后的规则不起作用的原因可能是因为您从 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'] 相同?

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

    【讨论】:

      【解决方案2】:

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

      尝试将其更改为:

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

      【讨论】:

        【解决方案3】:

        如果你使用 .htaccess 文件来做 mod_rewrite 的好处,REQUEST_URI 没有开头的斜杠,例如 /admin/shop/ -> admin/shop/

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

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

        【讨论】:

        • 如果我将它添加到 http.conf 它会显示Invalid command 'RewriteLog', perhaps misspelled or defined by a module not included in the server configuration,即使 mod_rewrite 已启用并且正在工作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-06
        • 2018-07-26
        • 1970-01-01
        相关资源
        最近更新 更多