删除 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(临时)重定向进行测试以避免潜在的缓存问题。
但是,如果之前的“重定向问题”尚未解决,则可能会导致重定向循环。
当我输入: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(临时)重定向进行测试以避免潜在的缓存问题。
但是,如果之前的“重定向问题”尚未解决,则可能会导致重定向循环。