如何解决如何避免在 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 错误。
带有代码的 .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
用于 Indexes
,DirectoryIndex
用于 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 answer:https://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 举报,一经查实,本站将立刻删除。