我有一个 PHP 应用程序,可以加载除主页之外的所有 URL。
参观“https://my.site.com/“会产生“错误请求”错误消息。任何其他 URL,例如“https://my.site.com/SomePage/“ 运行正常。只有主页不起作用。
所有页面都使用 mod_rewrite 并通过单个调度脚本 Director.php 进行路由。直接访问 Director.php 也会产生“错误请求”错误。
但是 - 所有其他请求都通过 Director,并且它们都运行良好(主页除外),所以这不是 Director.php 脚本的问题吗?或者可能是?
我在 Apache2 错误日志中没有看到任何内容,在 PHP 错误日志中也没有看到任何 PHP 错误。我尝试将 Director.php 的第一行更改为:
回显‘测试’; 出口();
但我仍然收到“错误请求”。
这是对主页请求的重写日志:
123.123.123.123 - - [18/Feb/2011:05:38:49 +0000] [my.site.com/sid#7f273d77cb80][rid#7f273da48b28/initial] (2) 使用请求的 uri 初始化重写引擎 / 123.123.123.123 - - [18/Feb/2011:05:38:49 +0000] [my.site.com/sid#7f273d77cb80][rid#7f273da48b28/initial] (3) 将模式 '^/([a-zA-Z0-9\-\_]+)/$' 应用于 uri '/' 123.123.123.123 - - [18/Feb/2011:05:38:49 +0000] [my.site.com/sid#7f273d77cb80][rid#7f273da48b28/initial] (3) 将模式 '^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$' 应用于 uri '/' 123.123.123.123 - - [18/Feb/2011:05:38:49 +0000] [my.site.com/sid#7f273d77cb80][rid#7f273da48b28/initial] (1)通过 / 123.123.123.123 - - [18/Feb/2011:05:38:49 +0000] [my.site.com/sid#7f273d77cb80][rid#7f273da5a298/subreq] (2) 使用请求的 uri /Director.php 初始化重写引擎 123.123.123.123 - - [18/Feb/2011:05:38:49 +0000] [my.site.com/sid#7f273d77cb80][rid#7f273da5a298/subreq] (2)重写'/Director.php'->'-[L,NC]' 123.123.123.123 - - [18/Feb/2011:05:38:49 +0000] [my.site.com/sid#7f273d77cb80][rid#7f273da5a298/subreq] (3) 将模式 '^/([a-zA-Z0-9\-\_]+)/$' 应用于 uri '-[L,NC]' 123.123.123.123 - - [18/Feb/2011:05:38:49 +0000] [my.site.com/sid#7f273d77cb80][rid#7f273da5a298/subreq] (3) 将模式 '^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$' 应用于 uri '-[L,NC]' 123.123.123.123 - - [18/Feb/2011:05:38:49 +0000] [my.site.com/sid#7f273d77cb80][rid#7f273da5a298/subreq] (2)本地路径结果:-[L,NC]
Apache2 访问日志
my.site.com:443 123.123.123.123 - - [18/Feb/2011:05:44:19 +0000] “GET / HTTP/1.1” 400 3223 “-” “Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8”
有什么想法吗?我不知道还能尝试什么?
更新:
这是我的虚拟主机配置:
重写引擎开启 RewriteLog“/LiveWebs/mysite.com/rewrite.log” 重写日志级别 5 # 不要重写 Crons 文件夹 ReWriteRule ^/Crons/ - [L,NC] ReWriteRule ^/phpmyadmin - [L,NC] ReWriteRule .php$ -[L,NC] # 这就是问题所在!! RewriteCond %{REQUEST_URI} !^/images/ [NC] 重写规则 ^/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1 [L,QSA] RewriteCond %{REQUEST_URI} !^/images/ [NC] 重写规则 ^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1&action=$2 [L,QSA]
问题出在“ReWriteRule .php$ -[L,NC]”这一行。当我注释掉它时,主页会加载。问题是,如何让以 .php 结尾的 URL 直接通过(而不会破坏主页)?
答案1
看起来好像没有任何重写规则会匹配/
:在有问题的规则之后的两个重写规则中,“最小”匹配是/./
和 /././
,因此这两个规则没有机会匹配/
。
您可以添加特定于 URL 的重写规则https://my.site.com/就在“.php”之前:
RewriteRule ^/$ /Director.php?rt= [L,QSA]
当您向 Web 服务器发出请求时/
,它将提供第一个找到的页面,其名称在DirectoryIndex
指令中列出。如果您DirectoryIndex
包含index.php
该页面,则很可能该页面实际上被重写规则捕获。