如何做.htaccess URL重写以包含URL中的index.php?

时间:2015-03-13 17:56:20

标签: php apache .htaccess mod-rewrite url-rewriting

我的主机上安装了一个基于php的系统(称为OJS)。它使用SMARTY来创建页面。我的网页包含以下网址: http://example.com/ojs/index.php/foo

我希望能够在地址栏中键入http://example.com/ojs/foo,而.htaccess会将index.php添加到url中,并执行新的完整URL,以便index.php可以生成所需的页面

现在我在ojs文件夹中的.htaccess文件中使用以下内容。

<IfModule mod_rewrite.c>
   Options +FollowSymLinks
   RewriteEngine on
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ index.php/$1 [QSA,L]
  </IfModule>

我还在.htaccess中尝试了很多其他语法和指令。但不是他们的作品。 当我在地址栏中输入http://example.com/ojs/index.php/foo时,我会得到我想要的页面。 当我输入http://example.com/ojs/foo(或任何未在http://example.com/ojs/blahblahttp://example.com/ojs/index.php/blahblahbla等oj中定义的页面时),它会显示主页http://example.com/ojs/

我做了一个测试,我猜Rewrite规则至少做了些什么。我在文件index2.php(在ojs文件夹中)中创建了一个虚拟的PHP代码,它回显了超全局值。对于此测试,我修改了重写规则以包含index2.php,并得到以下结果:

$_SERVER['HTTP_HOST']: example.com
$_SERVER['REQUEST_URI']: /ojs/anything
$_SERVER[SCRIPT_NAME]: /ojs/index2.php
$_SERVER['PHP_SELF']: /ojs/index2.php
$_SERVER['REQUEST_METHOD']: GET
$_SERVER['PATH_INFO']:  
$_SERVER['ORIG_PATH_INFO']: /anything
__FILE__: /home/user/public_html/ojs/index2.php  

任何人都可以想到为什么它与index2.php一起使用并且它不能与index.php一起使用?

我的配置是否有帮助:

  

PHP版本5.3.29,   Apache 2.2.29版,   主机:Cpanel,共享Linux主机,
  我无权访问主错误日志或Apache配置文件。

非常感谢,

2 个答案:

答案 0 :(得分:0)

我认为这与CodeIgniter类似,我们从url中删除index.php。 您可以使用以下.htaccess代码从url中删除index.php。您必须将以下代码放在项目的根文件夹中。

RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php/$1 [L]

答案 1 :(得分:0)

坦率地说,我怀疑OJS系统正在阅读REQUEST_URI,并期望它的格式为/ojs/index.php/foo。它取而代之的是/ojs/foo,因为它无法识别,显示主页面。

我想你需要告诉(或修改)OJS以期待/ojs/foo表格。

只是要仔细检查Apache是​​不是搞乱了,添加一个R=301标志进行测试。如果我是对的,你应该重定向到/ojs/index.php/foo - 当浏览器遵循该重定向时,它会起作用。当然,这不是最理想的,因此应该遵循OJS的预期。 :)

(顺便说一句,这里不需要QSA。)