Plesk上的PHP和mod_rewrite问题

时间:2012-08-26 12:40:23

标签: php apache mod-rewrite plesk

我在我的智慧结束......我正在尝试做一些简单的事情,但我无法理解出了什么问题......

我只是尝试将所有请求发送到域,并将它们路由到index.php

为清晰起见编辑:作为框架的一部分,index.php充当请求的调度程序。

我已经在我的本地机器上工作没有问题了,但是在服务器上(VPS Linux和Plesk)我遇到了各种各样的问题...

为清晰起见编辑:这些规则在虚拟主机的vhost.conf配置文件中定义。

这是mod_rewrite:

<IfModule rewrite_module>
    RewriteEngine On
    RewriteRule ^/.* /index.php
</IfModule>

当我尝试访问“www.mydomain.com/home/index”时(例如),这是apache错误日志:

[debug] core.c(3072): [client xxx.xxx.xxx.xxx] r->uri = /phppath/cgi_wrapper/phppath/cgi_wrapper/phppath/cgi_wrapper/home/index
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /phppath/cgi_wrapper/phppath/cgi_wrapper/home/index
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /phppath/cgi_wrapper/home/index
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /home/index

从跟踪中可以看出,似乎将/ home / index重定向到/ phppath / cgi_wrapper /然后似乎再次传递给/ phppath / cgi_wrapper / phppath / cgi_wrapper / home / index,等等直到达到最大内部重定向。

将HTTP 500发送到浏览器。

进一步编辑 - 额外信息。从Plesk散布文件的方式我可以看出,这些只是对虚拟主机有影响的两行。我认为可能是Action语句......我可以在vhost.conf中以某种方式覆盖它吗?

in php-cgi.conf:
ScriptAlias /phppath/ "/var/www/cgi-bin/cgi_wrapper/"
Action php-script /phppath/cgi_wrapper

in php.conf:
AddHandler php5-script .php

进一步编辑:在动态生成的conf文件中(在vhost级别)找到它。

<Files ~ (\.php)>
    SetHandler None
    AddHandler php-script .php
    Options +ExecCGI
    allow from all
</Files>

有没有人知道发生了什么?我已经把头发拉了两天......提前谢谢

2 个答案:

答案 0 :(得分:0)

经过多次撕裂头发,咬牙切齿,以及后来的三个键盘......我找到了一些有用的东西。这不是很漂亮,但它确实起作用......如果有人可以提供任何改进,请做 - 我全都听见了。还是眼睛。原样。

所以,我首先注意到Apache Log中经常出现/phppath/cgi_wrapper/home/index问题,这让我想到:“也许我不应该将/home/index传递给PHP CGI,但我应该通过{ {1}}”。所以,我修改了Rewrite如下:

index.php

我只是添加了PassThrough(PT)标志,根据文档将重写结果传递给处理程序。

这让我得到了以下apache error_log

<IfModule rewrite_module>
    RewriteEngine On
    RewriteLog /blah/blah/blah/rewrite_log
    RewriteLogLevel 5

    RewriteRule ^.*$ /index.php [PT]
</IfModule>

我认为这是一种改进,但它仍然无效。

然后我去了我闪闪发光的新 rewrite_log ,看看这是否能照亮我。我看到了:

[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /index.php
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /index.php
[debug] core.c(3078): [client xxx.xxx.xxx.xxx] redirected from r->uri = /index.php

因此,我从中推断出我遇到了同样的问题:xxx.xxx.xxx.xxx - - [28/Aug/2012:15:38:05 +0400] [www.mydomain.com/sid#7f3c39001360][rid#7f3c390bbc88/initial] (2) rewrite '/' -> '/index.php' xxx.xxx.xxx.xxx - - [28/Aug/2012:15:38:05 +0400] [www.mydomain.com/sid#7f3c39001360][rid#7f3c390bbc88/initial] (2) forcing '/index.php' to get passed through to next API URI-to-filename handler xxx.xxx.xxx.xxx - - [28/Aug/2012:15:38:05 +0400] [www.mydomain.com/sid#7f3c39001360][rid#7f3c390c2710/initial/redir#1] (2) init rewrite engine with requested uri /phppath/cgi_wrapper/index.php xxx.xxx.xxx.xxx - - [28/Aug/2012:15:38:05 +0400] [www.mydomain.com/sid#7f3c39001360][rid#7f3c390c2710/initial/redir#1] (3) applying pattern '^/(.*)$' to uri '/phppath/cgi_wrapper/index.php' 现在再次被传递到重写引擎中进行重写,而/phppath/cgi_wrapper/index.php再次出现了,这是被传回等等。

所以我添加了一个条件。 (这对我来说似乎很难看;我确信有更好的方法):

/index.php

RewriteCond基本上是这样说的:如果请求不以<IfModule rewrite_module> RewriteEngine On RewriteLog /blah/blah/blah/rewrite_log RewriteLogLevel 5 RewriteCond ${REQUEST_URI} !^/phppath RewriteRule ^.*$ /index.php [PT] </IfModule> 开头,请应用以下规则。

就是这样。现在它正在运作;所有请求都由index.php处理,如果需要。

答案 1 :(得分:0)

检查服务器是否支持mod_rewrite中的.htaccess,或者您可能必须使用以下代码编写web.config文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="false"/>
        <rewrite>
            <rules>
            <rule name="APPLICATION: https://<your-host-url>/" patternSyntax="Wildcard">
                <match url="*"/>
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
                    </conditions>
                <action type="Rewrite" url="index.php"/>
            </rule></rules>
        </rewrite>
    </system.webServer>
</configuration>