删除 URL 中自动添加的扩展

Removal of automatically added extension in URL

当我输入:domain.com/contact

页面自动显示:domain.com/contact.php

我希望当用户输入 domain.com/contact 时,URL 保持原样并显示 contact.php 文件。可能吗?

我试图在 htaccess 文件中添加 Options -Multiviews 行,但是当我键入 contact 时,页面显示 404 错误。

此外,我只想要 php extension。因为当用户输入domain.com/robots时,我不想显示robots.txt,而是显示404页面。

编辑:我当前的 .htaccess 文件没什么特别的,这里是:

RewriteEngine On
Options -Indexes
ErrorDocument 403 /404
ErrorDocument 404 /404

很明显,您的无扩展名 URL 目前依赖于 MultiViews (mod_negotiation)。但是,尚不清楚外部重定向(将 .php 扩展名附加到您在地址栏中看到的 URL )来自何处。 MultiViews 不这样做。因此,要么您有一些其他应用程序逻辑重定向以附加扩展名,要么您看到来自早期(错误)重定向的缓存响应(尽管如果禁用 MultiViews 导致 404,那么这似乎排除了“缓存”)。

也有可能您在其他地方(在服务器配置中)有可能执行此操作的指令,毕竟,MultiViews 必须在某处明确启用 - 默认情况下未启用。

Moreover, I want it only for php extension. Because when user types domain.com/robots I don't want robots.txt to be displayed, but 404 page.

在那种情况下,您不能使用 MultiViews 来管理您的无分机 URL。您需要使用 mod_rewrite 并在内部重写 URL 而不是专门针对 .php 文件。

请尝试以下方法:

# Ensure that MultiViews is disabled
Options -Indexes -MultiViews

# Specify the actual file in the ErrorDocument, not simply "/404"
ErrorDocument 403 /404.php
ErrorDocument 404 /404.php

RewriteEngine On

# Rewrite extensionless URL to ".php" if it exists
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^([^.]+)$ .php [L]

正则表达式 ^([^.]+)$ 假定您的无扩展名 URL 不包含点。唯一的点出现在文件扩展名 .php 之前 - 请求中省略了它。这允许指令更有效并避免检查静态资源等,并且自然地避免在内部重写请求以附加 .php 扩展名(适用时)后重新检查请求。

但是,这可能会也可能不会解决重定向问题。这可能首先取决于重定向的触发方式。


作为额外的好处,您还可以将对 .php 文件的直接请求重定向到 删除 文件扩展名。如果您要更改现有 URL 结构,其中 .php URL 可能已被外部第三方链接到的搜索引擎 and/or 编入索引,则这是必要的。

为此,您可以在 RewriteEngine 指令之后和 内部重写(附加扩展名)之前 立即添加以下规则。

# Remove the ".php" extension on direct requests
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.+)\.php$ / [R=301,L]

检查REDIRECT_STATUS环境变量的条件确保我们只检查来自客户端的直接请求,而不是重写后面指令的请求。

首先使用 302(临时)重定向进行测试以避免潜在的缓存问题。

但是,如果之前的“重定向问题”尚未解决,则可能会导致重定向循环。