提问人:Dirty Bird Design 提问时间:10/27/2010 最后编辑:Stephen OstermillerDirty Bird Design 更新时间:7/20/2023 访问量:347626
删除带有 .htaccess 的 .php 扩展名
Remove .php extension with .htaccess
问:
是的,我已经阅读了Apache手册并在这里搜索。出于某种原因,我根本无法让它工作。我最接近的是让它删除扩展,但它指向根目录。我希望它只在包含该文件的目录中工作。.htaccess
我需要对文件做三件事。.htaccess
- 我需要它来删除
.php
一个。我有几个使用选项卡的页面,URL 看起来像 - 这可能吗?page.php#tab
b.我有一个页面使用附加到 URL 的会话 ID,以确保您来自正确的地方,.www.domain.example/download-software.php?abcdefg
这可能吗?同样在这样做时,我是否需要从标题导航包含文件中的链接中删除?应该.php
IE "<a href="support.php">support</a>" be <a href="support">support</a>?
- 我希望它在每个 URL 之前强制,所以它不是 ,而是 .
www
domain.example
www.domain.example/page
- 我想从页面中删除所有尾部斜杠。
我会继续寻找、尝试等。在子目录中会导致任何问题吗?
答:
Gumbo 在 Stack Overflow 问题中的回答 如何使用 Apache mod_rewrite隐藏 .html 扩展应该可以正常工作。
回复 1) 将 .html 更改为 .php
回复 a.)是的,这是可能的,只需添加到 URL。#tab
回复 b.)这可以使用(查询字符串追加),见下文。QSA
这也应该在子目录路径中起作用:
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
评论
[L,
QSA]
/index/bla/bla
index.php
Apache mod_rewrite
你要找的是mod_rewrite,
描述:提供基于规则的重写引擎进行重写 即时请求的 URL。
一般来说,它的工作原理是将请求的文档与指定的正则表达式进行匹配,然后在内部(在 Apache 进程中)或外部(在客户端浏览器中)执行 URL 重写。这些重写可以像在内部转换为 .mod_rewrite
example.com/foo
example.com/foo/bar
Apache文档包括一个指南,我认为其中涵盖了您想要做的一些事情。详细mod_rewrite指南。mod_rewrite
强制子域www
我希望它在每个 URL 之前强制执行“www”,所以它不是而是
domain.example
www.domain.example/page
重写指南在 Canonical Hostname 示例下包含相关说明。
删除尾部斜杠(第 1 部分)
我想从页面中删除所有尾部斜杠
我不确定你为什么要这样做,因为重写指南包括一个完全相反的例子,即总是包括一个尾部斜杠。文档建议删除尾部斜杠很有可能导致问题:
尾部斜杠问题
描述:
每个站长都可以唱一首关于尾随问题的歌 在引用目录的 URL 上斜杠。如果缺少它们,则服务器 转储错误,因为如果您说而不是,则服务器会搜索名为 foo 的文件。因为这个文件 是它抱怨的目录。实际上,它试图自行修复它 大多数情况下,但有时需要通过以下方式模拟此机制 你。例如,在你做了很多复杂的URL之后 重写CGI脚本等。
/~quux/foo
/~quux/foo/
也许您可以扩展一下为什么要一直删除尾部斜杠?
删除扩展.php
我需要它来删除 .php
我能想到的最接近这样做的事情是使用 .php 扩展名在内部重写每个请求文档,即作为 .请注意,以这种方式进行操作将要求每个 somepage 实际上作为 somepage.php 存在于文件系统上。example.com/somepage
example.com/somepage.php
通过正则表达式的正确组合,这在某种程度上应该是可能的。但是,我可以预见到一些可能的问题,即索引页未正确请求且目录未正确匹配。
例如,这将正确地重写为以下请求:example.com/test
example.com/test.php
RewriteEngine on
RewriteRule ^(.*)$ $1.php
但会因为没有而无法加载example.com
example.com/.php
我猜想,如果您要删除所有尾部斜杠,那么从父目录中的文件名请求中选择目录索引请求将变得几乎不可能。如何确定对目录“foobar”的请求:
example.com/foobar
来自对名为 foobar(实际上是 foobar.php)的文件的请求
example.com/foobar
如果使用 RewriteBase
指令,则可能是可能的。但是,如果您这样做,那么这个问题就会变得更加复杂,因为您将需要 RewriteCond
指令来执行文件系统级别的检查,以检查请求是否映射到目录或文件。
也就是说,如果您删除删除所有尾部斜杠的要求,而是强制添加尾部斜杠,“没有 .php 扩展名”问题变得更加合理。
# Turn on the rewrite engine
RewriteEngine on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]
这仍然不完美 - 每个文件请求仍然在内部将 .php 附加到请求中。对“hi.txt”的请求会将其放入错误日志中:
[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat
但是还有另一种选择,设置如下所示的 and 指令:DefaultType
DirectoryIndex
DefaultType application/x-httpd-php
DirectoryIndex index.php index.html
更新 2013-11-14 - 修复了上述片段以纳入 nicorellius 的观察结果
现在对 hi.txt(和其他任何内容)的请求成功,请求将返回已处理的 test.php 版本,索引 .php 文件将再次工作。example.com/test
我必须为这个解决方案提供应有的荣誉,因为我通过在 Google 上搜索 php no extension apache 找到了它 Michael J. Radwins 博客。
删除尾部斜杠
一些搜索将我带到了一些搜索引擎优化页面。显然,一些内容管理系统(在这种情况下是Drupal)会在URL中提供带有和不带有尾部斜杠的内容,这在SEO世界中将导致您的网站产生重复的内容惩罚。源apache remove trailing slashes
该解决方案似乎相当微不足道,使用mod_rewrite
我们在请求的资源以 a 结尾的条件下重写,并通过发送回 HTTP 标头来重写 URL。/
301 Permanent Redirect
下面是他的例子,它假设你的域是 blamcast.net 的,并允许请求可以选择性地以 .www.
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
现在我们到了某个地方。让我们把它们放在一起,看看它是什么样子的。
必填 、 否 和 无尾斜杠www.
.php
这假定域是,并且它正在标准端口 80 上运行。foobar.example
# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html
# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST} !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*) http://www.foobar.example/$1 [L,R,NE]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
“R”标志在 RewriteRule
指令节中进行了描述。片段:
redirect|R [=code]
(强制重定向)前缀替换为(使新 URL 成为 URI)以强制 外部重定向。如果未给出代码,则 HTTP 响应 302 (暂时移动)将被退回。http://thishost[:thisport]/
结语
我无法成功删除斜杠。重定向最终给了我无限的重定向循环。在仔细阅读原始解决方案后,我的印象是上面的示例对他们有用,因为他们的 Drupal 安装是如何配置的。他特别提到:
在普通的 Drupal 站点上,启用干净的 URL 后,这两个地址 基本上是可以互换的
引用以斜杠结尾和不以斜杠结尾的 URL。此外
Drupal 使用一个名为的文件来告诉您的 Web 服务器如何 句柄 URL。这与启用 Drupal 的干净 URL 的文件相同 魔法。通过在文件的开头添加一个简单的重定向命令,您可以强制服务器自动删除任何 尾部斜杠。
.htaccess
.htaccess
评论
DirectoryIndex index index.html
DirectoryIndex index.php index.html
如果您正在使用 PHP 编码并想要删除 .php,以便您可以拥有如下 URL:
http://yourdomain.example/blah
-> 指向 /blah.php
这就是您所需要的:
<IfModule mod_rewrite.c>
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
不知道为什么其他答案对我不起作用,但我找到的这段代码确实如此:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
这就是我的 htaccess 和显示的全部内容example.com/page
example.com/page.php
以下代码对我来说很好:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
评论
如果您只想对一个特定文件执行此操作,请执行以下方法:
RewriteRule ^about$ about.php [L]
编号: http://css-tricks.com/snippets/htaccess/remove-file-extention-from-urls/
如果你的 URL 在 PHP 中喜欢 than 喜欢http://yourdomain.example/demo.php
http://yourdomain.example/demo
这就是您所需要的:
create file .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
评论
http://example.com/myfile
http://example.com/myfolder/
除了上面的其他答案,
您也可以尝试这样做以从文件中完全删除扩展名并避免无限循环:.php
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]
此代码将在 Root/.htaccess 中工作, 如果要将其放在子目录中的htaccess文件中,请务必更改RewriteBase。
在 Apache 2.4 及更高版本上,您还可以使用 END 标志来防止无限循环错误。以下示例在 Apache 2.4 上的工作方式与上述相同,
RewriteEngine on
RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]
评论
要从 PHP 文件中删除扩展名,例如:从您网站的根目录打开 .htaccess(如果不存在,请创建一个新扩展名)文件,并添加以下代码。.php
yoursite.example/about.php
yoursite.example/about
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
要从 HTML 文件中删除扩展名,例如:从网站根目录打开 .htaccess(如果不存在,请创建一个新扩展名)文件,并添加以下代码。.html
yoursite.example/about.html
yoursite.example/about
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
评论
我找到了 100% 适合我的概念:
# Options is required by Many Hosting
Options +MultiViews
RewriteEngine on
# For .php & .html URL's:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]
在网站的根目录中使用此代码 .htaccess 文件,如:
离线 - wamp\www\YourWebDir
在线 - public_html/
如果它无法正常工作,请更改 Wamp 的设置 服务器: 1) 左键点击 WAMP 图标 2) Apache 3) Apache 模块 4) 左键 单击rewrite_module
评论
RewriteRule
L
[L]
mod_rewrite
RewriteCond
Options +MultiViews
将参数从 to in (Debian 8) 更改后,.htaccess 文件必须包含:AllowOverride
None
All
/etc/apache2/apache2.conf
Options +MultiViews
AddHandler php5-script php
AddType text/html php
从文件中隐藏 .php 扩展名就足够了
评论
MultiViews
<a href="somepage.php">
</a>
<a href="somepage">
</a>
MultiViews
有效地在所有内容上启用无扩展名 URL。您的所有静态资源(图像、CSS、JS 等)也可以访问,无论是否使用文件扩展名。但是,最大的“缺点”之一是与mod_rewrite的意外冲突,因为 MultiViews (mod_negotiation) 是先处理的,并在将“重写”的 URL 交给mod_rewrite之前有效地重写 URL。这可能会导致 mod_rewrite 指令与预期的请求不匹配。@reformed
这是我用来从文件名中隐藏 .php
扩展名的代码:
## hide .php extension
# To redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L,NC]
注意:R=301
用于永久重定向,建议用于 SEO 目的。但是,如果只想进行临时重定向,请将其替换为 R
试试这个
以下代码肯定会起作用
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
尝试
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]
评论
我最终得到了以下工作代码:
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
试试这个:-
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
评论
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]
评论
对于 AWS 托管(Ubuntu 相关服务器)站点
步骤 1 :您需要编辑位于 中的 apache2 配置文件。/etc/apache2/apache2.conf
sudo nano /etc/apache2/apache2.conf
步骤 2 :您必须编辑如下所示的行:
<Directory /var/www/html/>
Option Indexes FollowSymbLinks
AllowOverride None <-------- FOCUS ON THIS
Require all granted
</Directory>
您需要将 替换为 ,然后您需要在终端的 apache2 中启用重写模式:AllowOverride None
AllowOverride All
sudo a2enmod rewrite
步骤 3 :重新启动 Apache
sudo service apache2 restart
步骤 4 :然后你可以编辑文件。.htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]
评论