【问题标题】:How to do .htaccess URL rewriting to include index.php in the URL?如何进行 .htaccess URL 重写以在 URL 中包含 index.php?
【发布时间】:2015-03-13 17:56:19
【问题描述】:

我的主机上安装了一个基于 php 的系统(称为 OJS)。它使用 SMARTY 来创建页面。我有带有 URL 的页面,例如: 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(或任何未在ojs 中定义的页面,例如http://example.com/ojs/blahblahttp://example.com/ojs/index.php/blahblahbla)时,它会显示主页http://example.com/ojs/

我做了一个测试,我猜 Rewrite rule 至少在做一些事情。我在文件 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 配置文件。

非常感谢,

【问题讨论】:

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


    【解决方案1】:

    我认为这类似于 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]
    

    【讨论】:

    • 感谢您的回复。我试过。但它仍然不起作用。
    • 您好,您需要授予 .htaccess 文件的读取和权限。
    • 它有644个权限。
    • 你能不能给777检查一下,一旦它开始工作,你可以把权限降级到644
    【解决方案2】:

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

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

    只是为了仔细检查 Apache 没有搞砸,添加一个 R=301 标志进行测试。如果我是对的,你应该得到一个重定向到/ojs/index.php/foo——当浏览器遵循这个重定向时,它就会工作。当然,这不是最理想的,因此应该遵循修复 OJS 的期望。 :)

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

    【讨论】:

    • 感谢@The Sidhekin。我会测试它。只是一个问题:使用 .htaccess 重写 URL 的全部意义在于,当从服务器请求地址 example.com/ojs/foo 时,Apache 服务器首先将其转换为 example.com/ojs/index.php/foo 然后处理它。如果 Apache 正确执行,那么 OJS 不应该获取 /ojs/foo,但它应该获取 /ojs/index.php/foo。我错过了什么吗?
    • @cybergeek654 REQUEST_URI 包含原始(预重写)请求的 URI 的路径组件;重写离开了。重写主要改变了最终得到服务的内容;在这种情况下 index.php。在您的情况下,它还会更改 PATH_INFO,并且它可以选择更改其他内容。 (我不知道 OJS,但我怀疑它使用 REQUEST_URI,如果它完全忽略 PATH_INFO,我不会感到惊讶,在这种情况下,只需重定向到 index.php(没有 /$1 PATH_INFO)会工作相同。)
    • 我现在明白了。有没有办法可以避免修改 OJS 代码并使其正常工作?
    • @cybergeek654 要更改 REQUEST_URI?我认为这意味着重定向。或者代理,也许?但我不认为我会打扰。相反,我会查看 OJS 配置,看看它是否不允许这样做。
    • OJS 有一个配置文件,我可以在其中设置 RESTful URL,通过这样做,在 OJS 页面中创建的所有 URL 将采用 example.com/ojs/foo 和 index.php 的形式从 URLS 中删除。此外,OJS 的常见问题解答说我应该在我的服务器中设置 .htaccess 来进行 URL 重写,以在用户请求的 URL 中包含 index.php。他们说我应该放入 .htaccess 的代码正是我粘贴在我的问题中的代码。我不知道为什么它不起作用!
    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多