我的主机上安装了一个基于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/blahbla或http://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配置文件。
非常感谢,
答案 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
。)