使用.htaccess删除.php扩展名


101

是的,我已经阅读了Apache手册并在此处进行了搜索。由于某种原因,我根本无法使它正常工作。我最接近的是删除扩展名,但它指向根目录。我希望它只在包含.htaccess文件的目录中工作。

我需要对.htaccess文件做三件事。

  1. 我需要它来删除.php

    一个。我有几个使用标签的页面,URL看起来像page.php#tab-这可能吗?

    b。我有一个页面使用在URL后面附加会话ID的页面,以确保您来自正确的位置www.domain.com/download-software.php?abcdefg

这可能吗?另外,是否需要从我的头文件导航包含文件中的链接中删除“ .php”?应该IE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. 我希望它在每个URL之前加上“ www”,所以不是domain.com,而是www.domain.com/page
  2. 我想从页面中删除所有结尾的斜杠。

我会继续寻找,尝试等。在子目录中会引起任何问题吗?



我很好奇,这有什么好处?这样是不是让您的用户不知道他们正在访问服务器上的哪个文件?
科洛布峡谷

两折。因此他们不知道我们提供的文件类型,而且看起来更干净IMO
Dirty Bird Design

另一个相关的问题:stackoverflow.com/questions/6534904/…
爱德华

Answers:


121

Gumbo在Stack Overflow问题中的答案如何使用Apache mod_rewrite隐藏.html扩展名应该可以正常工作。

关于1)将.html更改为.php

是的。可以,只需添加#tab到URL。

关于b。)使用QSA(Query String Append)可以实现,请参见下文。

这也应该在子目录路径中工作:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

感谢您的帮助人员,无论出于何种原因,我敢打赌,由于会话附加网址已硬编码在PHP文件中(长话说),我可以在没有上述限制的情况下访问它。我非常感谢您的帮助,这些.htaccess信息对我来说很棘手。
肮脏的鸟设计,2010年

8
@Pekka웃删除空格标志之间的[L,空格QSA],否则将导致500 Internal Server Error
Rahil Wazir 2014年

这将/index/bla/blaindex.php
elkebirmed

由于某种原因,这阻止了我的CSS加载:/
TheCrazyProfessor

!意味着不是。该规则说,如果尚未以.php结尾,则仅重写以添加.php
user339568

72

Apache mod_rewrite

您正在寻找的是mod_rewrite

说明:提供一个基于规则的重写引擎来即时重写请求的URL。

一般来说,mod_rewrite通过将请求的文档与指定的正则表达式进行匹配来工作,然后在内部(在apache进程内)或在外部(在客户端浏览器中)执行URL重写。这些重写很简单,就像在内部将example.com/foo转换为对example.com/foo/bar的请求一样。

Apache文档包括一个mod_rewrite指南,我认为您想做的某些事情已包含在其中。详细的mod_rewrite指南

强制www子域

我希望它在每个URL之前强制使用“ www”,因此它不是domain.com,而是www.domain.com/page

重写指南在Canonical Hostname示例下提供了有关说明。

删除尾部斜杠(第1部分)

我想删除页面中的所有尾部斜杠

我不确定您为什么要这样做,因为重写指南中包含一个与之完全相反的示例,即始终包含一个斜杠。文档建议删除尾部斜杠具有引起问题的巨大潜力:

尾部斜杠问题

描述:

每个网站管理员都可以唱一首关于目录引用URL末尾斜杠问题的歌曲。如果缺少它们,则服务器将转储错误,因为如果您说/~quux/foo而不是,/~quux/foo/ 则服务器将搜索名为foo的文件。而且由于该文件是目录,因此会抱怨。实际上,在大多数情况下,它会尝试自行修复它,但是有时您需要模仿此机制。例如,在您对CGI脚本进行了大量复杂的URL重写后,等等。

也许您可以继续说明为什么要一直删除斜杠?

删除.php扩展名

我需要它来删除.php

我想到的最接近的方法是在内部重写每个扩展名为.php的请求文档,即example.com/somepage会作为对example.com/somepage.php的请求进行处理。请注意,以这种方式进行操作将需要每个somepage实际上在文件系统上作为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指令来执行文件系统级别的检查,以检查请求是映射到目录还是文件。

就是说,如果您删除所有尾随斜杠的要求而改为强制添加尾随斜杠,则“ no .php extension”问题将变得更加合理。

# 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

但是还有另一种选择,像这样设置DefaultTypeand DirectoryIndex指令:

DefaultType application/x-httpd-php
DirectoryIndex index.php index.html

2013年11月14日更新-修复了以上代码片段,以整合尼古拉的观察

现在,对hi.txt(以及其他所有内容)的请求成功了,对example.com/test的请求将返回test.php的已处理版本,并且index.php文件将再次运行。

我必须在此解决方案应归功的地方给予信誉,因为我通过在Google上搜索php no extension apache来找到它,这是Michael J. Radwins博客

删除尾部斜杠

一些搜索apache remove trailing slashes使我进入了一些搜索引擎优化页面。显然,某些内容管理系统(在本例中为Drupal)会在URls后面加上或不加上斜杠的情况下提供内容,这在SEO世界中将导致您的网站遭受重复的内容惩罚。资源

该解决方案似乎相当琐碎,使用mod_rewrite我们在要求的资源以a结尾的情况下进行/重写,然后通过发送回301 Permanent RedirectHTTP标头重写URL 。

这是他的示例,假设您的域为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,也不能结尾

假定域为foobar.com,并且它在标准端口80上运行。

# 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.com/$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](强制重定向)使用前缀替换 http://thishost[:thisport]/(使新URL成为URI)来强制进行外部重定向。如果未提供任何代码,则将返回HTTP响应302(MOVED TEMPORARILY)。

最后说明

我无法成功去除斜线。重定向最终给了我无限的重定向循环。仔细阅读原始解决方案后,我会觉得上面的示例适用于他们,因为他们的Drupal安装是如何配置的。他具体提到:

在正常的Drupal网站上,启用了干净的URL,这两个地址基本上可以互换

引用以反斜杠结尾的URL。此外,

Drupal使用一个名为的文件.htaccess来告诉您的Web服务器如何处理URL。这是启用Drupal干净URL魔术的同一文件。通过在.htaccess文件的开头添加一个简单的重定向命令 ,您可以强制服务器自动删除任何尾随的斜杠。


哇,谢谢你。实际上,我能够使它正常工作,结果我的服务器上有些奇怪的东西我必须更换。无论如何,现在要解决下一个问题,从除一个页面之外的所有页面中删除.php。thx man
Dirty Bird

我喜欢看到经过深思熟虑,井井有条的答案。做得好...我注意到的一件事:你是说DirectoryIndex index index.html吗?还是DirectoryIndex index.php index.html
nicorellius

@nicorellius相信你是正确的。我已经根据您的观察更新了我的原始答案。
Tim Bielawa 2013年

我必须说这并不总是有效。试试下面的答案(用户1079877)
DonJoe

您才是真正的MVP。
ZainZaheer06

45

除了上述其他答案之外,

您也可以尝试这样做,以从文件中完全删除.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]

10
嗨,谢谢你。我已经尝试了多种解决方案来削减.php,但是只有这样才能正常工作:)
beamkiller

4
谢谢!此编辑的位置是Apache 2.4,Apache 2.5无限循环(并将达到500)[END]非常重要
Jake Bolam

23

以下代码对我来说很好用:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

除example.com变成所有文件和目录的索引外,此方法有效。(Apache 2.4)
earth2jason 2014年


10

更改参数后AllowOverride,从NoneAll/etc/apache2/apache2.conf(Debian的8),下面这个,.htaccess文件只是必须包含:

Options +MultiViews
AddHandler php5-script php
AddType text/html php

足以从文件中隐藏.php扩展名


希望这个更高。MultiViews开箱即用时为何还要烦恼URL重写的开销
Phil,

这很棒。有什么缺点吗?
改革了

@reformed谢谢。我不得不从<a href="somepage.php">链接更改链接</a>在源代码中将为<a href="somepage">链接</a>
Rodney Salcedo,

8

试试看
下面的代码肯定会起作用

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

5

不知道为什么其他答案对我不起作用,但是我发现的这段代码确实有用:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

这就是我的htaccess中的全部内容,而example.com/page显示了example.com/page.php


4

要从PHP文件中将.php扩展名删除,例如yoursite.com/about.php到yoursite.com/about,请执行以下步骤。从网站根目录打开.htaccess(如果不存在,则创建一个新文件),并添加以下代码。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

要将html文件中的.html扩展名从例如yoursite.com/about.html删除到yoursite.com/about,请执行以下步骤。

从网站根目录打开.htaccess(如果不存在,则创建一个新文件),并添加以下代码。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

参考:如何从URL中删除php扩展名


1
我唯一需要的答案。谢谢!:)
MatrixCow19年

2

如果您使用PHP进行编码,并且想要删除.php,则可以使用如下网址:

http://yourdomain.com/blah- >指向/blah.php

这就是您所需要的:

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

2

我发现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 Server的设置:1)左键单击WAMP图标2)Apache 3)Apache模块4)左键rewrite_module


RewriteRule标签之间不能有两个L[L]告诉mod_rewrite它是指定的最后一个规则RewriteCond
MD XF

2

这是我用来.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


2

我结束了以下工作代码:

RewriteEngine on 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

1

如果您在PHP中的网址(例如http://yourdomain.com/demo.php)http://yourdomain.com/demo

这就是您所需要的:

创建文件.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/(索引文件)。您能帮我使它适用于索引文件吗?
WesleyGonçalves19年

我认为您应该尝试使用@starkeen答案网址:stackoverflow.com/a/30566026/3786343
Kamlesh

1

尝试

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.