我正在尝试使用我在网上找到的教程制作自己的MVC PHP框架。 但是在理解htaccess文件中的rewrite_mod时遇到了问题。这是第一部分:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
1)如教程中所述,这些规则会将所有请求重定向到公用文件夹,因此第一个问题是为什么我们有两个规则?什么意思是第一个和第二个。一 2)第二部分是公共文件夹中的另一个htaccess文件,其中包含:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
</IfModule>
第二部分会将url重写为index.php?url = $ 1这部分很清楚,但这部分对我来说有点困难
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
我了解它,它告诉请求不应该是文件或目录,但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>
非常感谢。
答案 0 :(得分:2)
您可以合并和fix
根.htaccess:
RewriteEngine on
RewriteRule !^public/ public%{REQUEST_URI} [L]
这意味着如果REQUEST_URI不以/public/<uri>
/public
现在有些解释。
DOCUMENT_ROOT/.htaccess
:
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
public/
,请求URI为空,即http://site.com/
public/<URI>
DOCUMENT_ROOT/public/.htaccess
:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
这里面是公共目标:
RewriteCond %{REQUEST_FILENAME} !-f
表示请求不是有效文件RewriteCond %{REQUEST_FILENAME} !-d
表示请求不是针对有效目录RewriteRule ^(.*)$ index.php?url=$1
表示转发请求index.php?url=<uri>