不使用mod_rewrite如何运行没有扩展名的PHP?

12

在Apache 2.2和PHP 5中,如何最好地在没有 .php 扩展名的情况下运行PHP呢?例如,我有一个名为 app.php 的脚本,我想像这样调用它:

http://example.com/app

请注意,我仍然想保留文件的 .php 扩展名,并且我没有使用 mod_rewrite。也不想使用 index.php,因为它需要太多目录。

我找到了一种方法,通过在我的 .htaccess 文件中添加以下内容:

AddHandler server-parsed .php
SetHandler application/x-httpd-php
AddHandler application/x-httpd-php .php

使用这种方法会使页面运行速度变慢。我怀疑它在每个PHP页面上都调用了SSI,想知道是否有更好的方法来实现这一点。


我曾经看到过使用<file>指令来完成这个任务,但是在共享环境中运行它的可能性比mod_rewrite小得多。 - Pekka
2
就我个人而言,我会暗示他们关于“性能下降”和“我已经尽力了,船长!”直到他们安装mod_rewrite。 - Xorlev
3个回答

25

另一种选择是使用内容协商。打开多视图

Options +MultiViews
如果命名的资源不存在,Apache 会使用 glob 函数查找文件,然后根据浏览器发送的媒体类型和内容编码要求进行排序。如果只有一个文件(即您的 PHP 脚本),那么此 URL 将解析为该文件。

原来 mod_negotiation 已经安装在所有服务器上了。所以这是我目前找到的最佳解决方案。这样做也没有明显的性能差异。谢谢! - ZZ Coder
2
这仍然是相关的,你可能需要添加"AddType application/x-httpd-php .php .phtml .html .htm"到"/etc/apache2/mods-enabled/mime.conf:" - mckenzm
1
@mckenzm:.html和.htm文件不应该被解释为PHP。AddType只应该用于设置资源的MIME类型,而不是处理程序。对此,有AddHandler(即使在通过CGI运行PHP时也可以工作)。 - outis

7

您也可以在.htaccess文件中强制指定特定文件的MIME类型:

<Files app>
ForceType application/x-httpd-php
</Files>

-1

简短的回答是,您无法按照您想要的方式执行此操作。PHP需要一些扩展程序才能执行文件,因此最好将其保留为*.php。

除非您使用mod_rewrite,否则必须使用完整的文件名和扩展名来调用文件。

这就是mod_rewrite的美妙之处--它让您可以做到这样的事情。

我想向您提出问题--为什么您不能使用mod_rewrite?这是环境问题、选择问题还是您正在使用Lighttpd(lighty)?

扩展

在类似于以下内容的东西中包装您的重写规则,以防服务器不支持mod_rewrite而导致其崩溃:

<IfModule mod_rewrite.c>
// DO REWREITE HERE
</IfModule>

如果您认为这是一个安全问题或同样有效的问题,那么您还可以进行以下检查,并将它们发送到自定义404页面甚至您的文档,并给出启用mod_rewrite的示例并解释其必要性等。第二个检查是可选的--如果您不使用它,则用户将仅看到.php扩展名,但您的页面应该仍然可以正常工作。
<IfModule !mod_rewrite.c>
    ErrorDocument 404 /application/errors/404.php
    // ERROR 404 ABOVE OR DO ANOTHER DIRECT REDIRECT TO AN INFORMATION PAGE
</IfModule>

由于某些原因,一些服务器上未安装mod_rewrite,但该网站将在这些服务器上运行。我已经通过不使用扩展程序使其正常工作。只是想知道是否有更快的方法,而不必使用SSI。 - ZZ Coder
@ZZ Coder - 也许有人能为你提供某种奇迹,但我怀疑——我以前尝试过这件事情,从未找到有效的解决方案。告诉人们如果他们的服务器不支持mod_rewrite,那么他们将看到PHP扩展名,这样做是否可行?请参见我的编辑,了解在没有启用mod_rewrite的情况下如何避免.htaccess出问题。这就是像wordpress这样的东西的工作原理,它为他们做得很好。 - Shane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接