微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何避免在 url 上输入 .php 的需要?

如何解决如何避免在 url 上输入 .php 的需要?

我在 MacOs Big Sur 上,使用 Apache 和 PHP。我想要的是:不需要将 .PHP 放在我的文件末尾来加载它。

例如,不要在 URL 上输入:

127.0.0.1/public_html/home.PHP

我只想打字

127.0.0.1/public_html/home

为了实现这一点,我在 .htaccess 中使用了以下代码

RewriteEngine On
Options -Indexes 
DirectoryIndex home.PHP index.PHP 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.PHP -f
RewriteRule ^(.+)$ $1.PHP [L]

上面的代码适用于我的主机,但由于某种原因,它不适用于我的开发机器。相反,会出现 404 错误

404 Not Found Message

带有代码.htaccess 文件位于 public_html 文件夹的根目录中。

我错过了什么?

解决方法

通过在 .htaccess 文件的顶部输入一些“废话”并且不会得到一个错误(通常你会得到一个 500 Internal Server Error),看起来 {{1 }} 覆盖未在服务器上启用。因此,.htaccess 文件实际上已被禁用 - 它们在 Apache 2.4 中默认为禁用。

要启用 .htaccess 覆盖(以允许 .htaccess 覆盖服务器配置),您需要在服务器配置的相应 .htaccess 容器中设置 AllowOverride 指令(或 <Directory> 容器)。 Apache 2.4 上的默认值是 <VirtualHost>

根据发布的指令,您至少需要:

AllowOverride None

AllowOverride FileInfo Indexes Options 用于 mod_rewrite,FileInfo 用于 IndexesDirectoryIndex 用于 Options 和相关指令。

虽然只是设置很常见(也更容易):

Options

参考:


AllowOverride All

这些指令并不严格正确。虽然它们可能适用于您正在测试的 URL,但如果您只是在 URL 中附加一个斜杠(并且没有该名称的目录),它们将导致重写循环(500 错误响应),例如。 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.+)$ $1.php [L] (或 /home/)。这是因为您测试 /home/<anything> 文件是否存在的条件不一定与您要重写的 URL 路径相同。有关此问题的详细解释,请参阅 ServerFault 上以下问题的 my answerhttps://serverfault.com/questions/989333/using-apache-rewrite-rules-in-htaccess-to-remove-html-causing-a-500-error

此外,无需检查请求是否映射到目录,然后检查请求 + .php 扩展名是否映射到文件。如果请求映射到一个文件,那么它就不能是一个目录,所以如果第二个条件为真,则第一个条件也必须为真,因此是多余的。

并且无需在 .php TestString 中对文字点进行反斜杠转义 - 这是一个“普通”字符串,而不是正则表达式。

所以,这些指令应该这样写:

RewriteCond

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f RewriteRule (.+) $1.php [L] 不应在此处使用。)

您可以通过排除已经包含看起来像文件扩展名的请求来进一步优化此功能(假设您需要重写的 URL 在 URL 路径末尾附近不包含点)。例如:

RewriteBase

(对于第二个版本,是否设置 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f RewriteRule !\.\w{2,4}$ %{REQUEST_URI}.php [L] 无关紧要 - 未使用。)

RewriteBase

您提供了 DirectoryIndex home.php index.php 的示例 URL(附加了 /public_html/home)。但是,当仅请求目录 .php 时,此 DirectoryIndex 指令也允许提供 home.php。它应该是一个或另一个,而不是两者。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。