我在我的智慧结束......我正在尝试做一些简单的事情,但我无法理解出了什么问题......
我只是尝试将所有请求发送到域,并将它们路由到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>
有没有人知道发生了什么?我已经把头发拉了两天......提前谢谢
答案 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>