Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 请求文件名的奇怪行为?_Php_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Php 请求文件名的奇怪行为?

Php 请求文件名的奇怪行为?,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我使用的是MAMP,基于虚拟主机的设置创建了一个“.dev”tld用于工作。 我的站点的.htaccess使用mod_重写,如下所示: RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L] Rewrite

我使用的是MAMP,基于虚拟主机的设置创建了一个“.dev”tld用于工作。 我的站点的.htaccess使用mod_重写,如下所示:

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f

RewriteRule ^(.*)$ $1.php [L]
RewriteRule ^(butchers|news|recipes)/([a-zA-Z0-9-/]+)$ /$1.php?s=$2 [L,QSA]
我的网站以肉店目录为特色。列表视图由
butchers.php显示,可在
butchers
访问。详细视图由
butchers.php?s=some butcher name
显示,可访问
butchers/some butcher name
。 正如您所看到的,同样的机制也适用于新闻和食谱部分

好吧,事情是这样的:这过去是有效的。它工作得很好,然后我在升级MAMP后重新启动了我的系统,现在它给了我一个内部服务器错误。我假设我已经从Apache1.x升级到了2.x;升级后,我不得不重做vhost配置,但其他一切都很普通(和上次一样),只是我禁用了
多视图
。mod_重写日志如下所示(前几列被截断)

以下是我对正在发生的事情的理解:

  • 我的行动单位要求
    屠夫/示例屠夫
  • 当RewriteCond中使用请求\u文件名时,它输出的路径仅包含
    屠夫
    ,而不是
    屠夫/示例屠夫
  • 这不会发生,因为
    butchers.php
    是真实的
  • 根据重写规则,允许重写附加“.php”
  • 当它追加时,它将其追加到原始请求,
    butchers/example butcher
  • 内部重定向使用
    butchers/example butcher.php重新启动循环
然后,这个过程再次以同样的问题开始——RewriteCond测试这个奇怪的、不完整的路径版本,但在正确的路径上运行。这种情况发生了十次,在apache达到极限并发出500次警告之前,积累了越来越多的
.php

  • 请求<代码>屠夫/示例屠夫
  • butchers.php
    是真正的文件吗?对!
  • 追加
    .php
  • 请求
    butchers/example butcher.php
  • butchers.php
    是真正的文件吗?对!
  • 追加
    .php
  • 请求
    butchers/example butcher.php.php
  • 。。。等等
  • 因此,我可以理解为什么有一个循环,为什么它要不断地向自身添加
    .php
    ,我只是不明白为什么REQUEST\u FILENAME只给出路径的第一级。我找不到任何文件表明这是规定的行为

    有什么想法吗?我已经为此浪费了整整一个工作日:/


    谢谢

    这是因为
    %{REQUEST\u FILENAME}
    变量不仅仅是映射到单个文件/目录的请求URI。当您有如下请求时:

    /foo/bar/something
    
    您有以下任一文件:

    /foo.php
    /foo/bar.php
    /foo/bar/something.php
    
    条件:

    RewriteCond %{REQUEST_FILENAME}.php -f
    
    将为真,因为mod_rewrite也会考虑路径信息。如果您有其中一个php文件,那么mod_rewrite将尝试巧妙地找出请求的URI是否实际位于请求的URI路径中,并将
    .php
    添加到该路径节点,而不是添加到最后。要严格检查请求+
    .php
    是否存在,您需要执行以下操作:

    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
    
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f