0

我束手无策...我正在尝试做一些简单的事情,但我不明白出了什么问题...

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

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

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

为清楚起见进行编辑:这些规则在虚拟主机的 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 文件(在虚拟主机级别)中找到了这个。

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

有没有人对正在发生的事情有任何想法?我已经拉头发两天了......提前谢谢

4

2 回答 2

1

检查您的服务器是否支持mod_rewritein.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>
于 2018-12-02T11:59:57.553 回答
0

经过大量的头发撕裂,咬牙切齿,以及三个键盘之后......我设法找到了一些有用的东西。它不漂亮,但它确实有效......如果有人可以对此提供任何改进,请做 - 我全神贯注。或者眼睛。原来如此。

因此,我首先注意到/phppath/cgi_wrapper/home/indexApache 日志中反复出现的问题,这让我想到:“也许我不应该传递/home/index给 PHP CGI,但我应该传递index.php”。因此,我将 Rewrite 修改如下:

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

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

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

这让我得到了以下 apache error_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

我认为这是一种改进,但它仍然无法正常工作。

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

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又被传回了,等等。

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

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

    RewriteCond ${REQUEST_URI} !^/phppath
    RewriteRule ^.*$ /index.php [PT]
</IfModule>   

RewriteCond 基本上是在说:如果请求不以 . 开头,则应用以下规则/phppath

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

于 2012-08-28T13:07:04.740 回答