为什么这个RewriteRule和一起工作,而不和一起工作?

我有一个非常简单的RewriteRule,但我不明白为什么它不想工作。 也许它只是疲惫的说话,但似乎有些不可思议。

我想redirect一个类似http://mydomain.com/abchttp://mydomain.com/abc/index.php/xyz ,但我不希望url改变。

这是我的完整的.htaccess

 RewriteEngine On RewriteBase /abc/ #redirect the homepage RewriteRule ^$ index.php/msj [QSA,L] 

当我这样做,我得到“没有指定的input文件”。 如果我将[QSA,L]更改为[R],它将起作用,但实际上会redirectURL。

我误解了什么?

编辑:$ _SERVER的输出

 array(34) { [ "PATH"]=> string(29) "/bin:/usr/bin:/sbin:/usr/sbin" [ "RAILS_ENV"]=> string(10) "production" [ "FCGI_ROLE"]=> string(9) "RESPONDER" [ "UNIQUE_ID"]=> string(24) "UxDcvK3suH0AABgWvXUAAAAj" [ "SCRIPT_URL"]=> string(1) "/" [ "SCRIPT_URI"]=> string(22) "http://themspress.org/" [ "dsid"]=> string(8) "25793844" [ "ds_id_25793844"]=> string(0) "" [ "DH_USER"]=> string(13) "juancommander" [ "HTTP_HOST"]=> string(14) "themspress.org" [ "HTTP_CONNECTION"]=> string(5) "close" [ "HTTP_ACCEPT"]=> string(74) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" [ "HTTP_USER_AGENT"]=> string(120) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36" [ "HTTP_ACCEPT_ENCODING"]=> string(17) "gzip,deflate,sdch" [ "HTTP_ACCEPT_LANGUAGE"]=> string(23) "en-US,en;q=0.8,es;q=0.6" [ "HTTP_COOKIE"]=> string(190) "OJSSID=Siy7xdofJurGtBcNUk1880; __utma=154159997.1153519437.1393351515.1393522373.1393598726.4; __utmc=154159997; __utmz=154159997.1393351515.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)" [ "SERVER_SIGNATURE"]=> string(0) "" [ "SERVER_SOFTWARE"]=> string(6) "Apache" [ "SERVER_NAME"]=> string(14) "themspress.org" [ "SERVER_ADDR"]=> string(15) "173.236.187.201" [ "SERVER_PORT"]=> string(2) "80" [ "REMOTE_ADDR"]=> string(14) "189.138.120.63" [ "DOCUMENT_ROOT"]=> string(51) "/home/juancommander/themspress.org/var/www/html/ojs" [ "SERVER_ADMIN"]=> string(24) "webmaster@themspress.org" [ "SCRIPT_FILENAME"]=> string(61) "/home/juancommander/themspress.org/var/www/html/ojs/index.php" [ "REMOTE_PORT"]=> string(5) "53719" [ "GATEWAY_INTERFACE"]=> string(7) "CGI/1.1" [ "SERVER_PROTOCOL"]=> string(8) "HTTP/1.1" [ "REQUEST_METHOD"]=> string(3) "GET" [ "QUERY_STRING"]=> string(0) "" [ "REQUEST_URI"]=> string(1) "/" [ "SCRIPT_NAME"]=> string(10) "/index.php" [ "PHP_SELF"]=> string(10) "/index.php" [ "REQUEST_TIME"]=> int(1393614012) } 

我在Dreamhost文档中发现了问题的根源。

看起来:

与Apache 2.2配对的FastCGI版本似乎不像重写index.php / $ 1。 相反,它喜欢index.php?$ 1,但一些CMS不喜欢。

我正在使用的CMS不喜欢那样。 所以撤销的评论使用?$ 1是在正确的轨道上,但因为我没有解释,而我使用的CMS(开放日记系统)不能与一个?之后的pathinfo的东西,然后它只是不工作。

解决方案是从FastCGI变成只有普通的CGI。

以下是发生的事情:

您发送http://mydomain.com/abc的请求。 Apache的mod_rewrite将URL重写为http://mydomain.com/abc/index.php/msj但保留了第一个URI。 所以当Apache要求php来处理请求时, $_SERVER['REQUEST_URI']将是/abc/ not /abc/index.php/msj ,因为你的PHP应用程序(OJS)使用$_SERVER['REQUEST_URI']来处理该请求,它不会知道重写应用到你的URL。 当你用[R]替换[QSA,L]时,apache发送一个Location头到浏览器。 您的浏览器发送另一个实际更改$_SERVER['REQUEST_URI']请求。

不幸的是,我不知道要重写那部分。


更新 :把这个在你的.htaccess文件中,检查它是否有效?

 AcceptPathInfo On 

窍门

把它放在你的.htaccess文件中:

 RewriteRule ^$ index.php?undone=/msj [QSA,L] 

编辑你的index.php文件,并把它放在第一个开始:

  if(isset($_GET['undone'])){ $_SERVER['REQUEST_URI'] = '/abc/index.php' . $_GET['undone']; unset($_GET['undone']); }