Apache mod_重写模块是如何工作的?

Apache mod_重写模块是如何工作的?,apache,.htaccess,Apache,.htaccess,我正试图使用在网上找到的教程来创建自己的MVC PHP框架。 但是我在理解htaccess文件中的rewrite_mod时遇到了一个问题。以下是第一部分: <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] </IfModule> 我了解了它,它告诉我请求不应该是一个

我正试图使用在网上找到的教程来创建自己的MVC PHP框架。 但是我在理解htaccess文件中的rewrite_mod时遇到了一个问题。以下是第一部分:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$    public/     [L]
    RewriteRule    (.*) public/$1    [L]
 </IfModule>
我了解了它,它告诉我请求不应该是一个文件或目录,而index.php是一个文件(在公共目录中)。 还有一个问题,为什么当我们删除最后一个.htaccess文件(在公共目录中)时 出现以下错误:

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at admin@127.0.0.1 to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.

Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
当我们只有一个只包含这一部分的htacces时,它工作得很好吗

<IfModule mod_rewrite.c>
RewriteEngine On
</IfModule>

重新启动发动机

非常感谢。

您可以组合并修复根目录。htaccess:

RewriteEngine on
RewriteRule !^public/ public%{REQUEST_URI} [L]
这意味着如果请求URI不是以
/public
开头,则转发到
/public/

现在解释一下。

DOCUMENT\u ROOT/.htaccess

RewriteRule    ^$    public/     [L]
RewriteRule    (.*) public/$1    [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
  • 第一条规则在内部转发到
    public/
    ,请求URI为空,即
    http://site.com/
  • 第二条规则是在内部将偶数URI转发到
    public/
  • DOCUMENT\u ROOT/public/.htaccess

    RewriteRule    ^$    public/     [L]
    RewriteRule    (.*) public/$1    [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
    
    在公共目录中:


  • RewriteCond%{REQUEST\u FILENAME}-f
    表示如果请求的文件无效

  • RewriteCond%{REQUEST\u FILENAME}-d
    表示如果请求的目录无效
  • RewriteRule^(.*)$index.php?url=$1
    表示将请求转发到
    index.php?url=

  • 参考:感谢您的评论,我需要首先了解这一切是如何工作的:)添加了一些解释RewriteCond%{REQUEST_FILENAME}-f表示如果请求不是针对有效文件。但公共文件夹中的index.php是一个文件!是的,这是正确的,所以如果您以
    http://site.com/public/index.php
    那么规则将不会触发。我删除了两行:RewriteCond%{REQUEST\u FILENAME}-f RewriteCond%{REQUEST_FILENAME}-它仍然可以很好地工作,所有它重定向到index.php!!!!这正常吗?即使对于不存在的文件/文件夹也是如此