使用.htaccess删除.php扩展名

是的,我读过Apache手册并在这里search。 出于某种原因,我根本无法得到这个工作。 离我最近的就是删除扩展名,但是它指向根目录。 我想这只是在包含.htaccess文件的目录中工作。

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

  1. 我需要它来删除.php

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

    湾 我有一个页面使用附加到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. 我想从网页中删除所有尾部的斜杠。

我会继续寻找,尝试等。会在一个子目录导致任何问题?

Gumbo的堆栈溢出问题的答案如何用Apache mod_rewrite隐藏.html扩展应该很好。

重新1)将.html更改为.php

Re a。)是的,这是可能的,只需要添加#tab的URL。

这是可能的使用QSA (查询string追加),见下文。

这也应该在一个子目录path中工作:

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

Apache mod_rewrite

你在找什么是mod_rewrite ,

说明:提供一个基于规则的重写引擎,用于重写所请求的URL。

一般来说, mod_rewrite通过将请求的文档与指定的正则expression式匹配来工作,然后在内部(在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部分)

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

我不知道你为什么要这样做,因为重写指南包含一个完全相反的例子 ,即总是包含一个尾部的斜线。 文件build议删除尾部的斜线有很大的潜在的问题:

尾随斜线问题

描述:

每个站长都可以在引用目录的URL上唱一首关于尾部斜线问题的歌曲。 如果它们丢失了,服务器会抛出一个错误,因为如果你说/~quux/foo而不是/~quux/foo/那么服务器search一个名为foo的文件。 而且因为这个文件是一个它抱怨的目录。 其实它试图在大多数情况下解决它自己,但有时这个机制需要你模仿。 例如,你已经做了很多复杂的URL重写CGI脚本等

也许你可以扩展你为什么要一直删除结尾的斜线?

删除.php扩展名

我需要它来删除.php

最接近这样做,我能想到的是内部重写每个请求文件扩展名为.php,即example.com/somepage而是作为example.com/somepage.php的请求处理。 请注意,以这种方式进行将需要在文件系统上每个somepage实际上以somepage.php的forms存在。

正则expression式的正确组合在某种程度上应该是可能的。 但是,我可以预见索引页面没有被正确请求和正确匹配目录的一些可能的问题。

例如,这将正确地将example.com/test重写为example.com/test.php的请求:

 RewriteEngine on RewriteRule ^(.*)$ $1.php 

但会使example.com无法加载,因为没有example.com/.php

我会猜测,如果你要删除所有的尾部斜线,那么从父目录中的文件名请求中select一个目录索引的请求将变得几乎不可能。 你如何确定目录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 

但是还有另一种select,像这样设置DefaultTypeDirectoryIndex指令:

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

更新2013年11月14日 – 修正了上面的片段纳入nicorellius的观察

现在请求hi.txt(以及其他)成功,请求example.com/test将返回test.php的处理版本,index.php文件将再次工作。

我必须给信贷在这个解决scheme的信贷,因为我发现它Michael J. Radwins博客通过search谷歌的PHP没有扩展Apache

删除尾部的斜杠

一些searchapache remove trailing slashes带我到一些search引擎优化页面。 显然有些内容pipe理系统(在这种情况下,Drupal)会使内容可用,有没有在URL中的尾随斜线,这在SEO世界将导致您的网站产生重复的内容罚款。 资源

解决scheme似乎相当简单,使用mod_rewrite我们重写的条件是所请求的资源以/结束并通过发回301 Permanent Redirect HTTP标头来重写URL。

这是他的例子,它假设你的域名是blamcast.net,并允许请求可选地以www.为前缀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] (强制redirect)使用http://thishost[:thisport]/ (使新URL为URI)的前缀replace强制外部redirect。 如果没有给出代码,则返回302( MOVED TEMPORARILY )的HTTP响应。

最后的注意

我无法成功地删除斜杠。 redirect最终给了我无限的redirect循环。 在仔细阅读原始解决scheme之后,我觉得上面的例子对他们有效,因为他们的Drupal安装是如何configuration的。 他特别提到:

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

参考以斜线和斜线结尾的URL。 此外,

Drupal使用一个名为.htaccess的文件告诉你的Web服务器如何处理URL。 这是使Drupal的干净的URL魔术的文件。 通过添加一个简单的redirect命令到您的.htaccess文件的开始,您可以强制服务器自动删除任何结尾的斜线。

除了上面的其他答案之外,

您也可以尝试从文件中完整删除.php扩展名,并避免无限循环

 RewriteEngine On RewriteBase / RewriteCond %{THE_REQUEST} ^[AZ]{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] 

以下代码适用于我:

 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/

从PHP文件(例如yoursite.com/about.php到yoursite.com/about)中删除.php扩展名请按照下列步骤操作。 从您的网站的根目录打开.htaccess文件(如果不存在,请创build新文件),然后添加以下代码。

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

从html文件(例如yoursite.com/about.html到yoursite.com/about)中删除.html扩展名请按照下列步骤操作。

从您的网站的根目录打开.htaccess文件(如果不存在,请创build新文件),然后添加以下代码。

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

参考: 如何删除URL的PHP​​扩展

如果您使用PHP进行编码,并且想要移除.php,那么您可以使用以下URL:

http://yourdomain.com/blah – >哪个指向/blah.php

这是你需要的一切:

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

/etc/apache2/apache2.conf 8)中将参数AllowOverrideNone更改为All之后,.htaccess文件必须包含:

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

这足以隐藏文件的.php扩展名

不知道为什么其他的答案不适合我,但我发现这个代码:

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

这就是我的htaccess和example.com/page显示example.com/page.php

如果你的PHP像http://yourdomain.com/demo.php比像http://yourdomain.com/demo

这是你需要的一切:

创build文件.htaccess

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

这里是我用来从文件名隐藏.php扩展名的代码:

 ## hide .php extension # To redirect /dir/foo.php to /dir/foo RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s([^.]+)\.php [NC] RewriteRule ^ %1 [R=301,L,NC] 

注意: R=301是永久redirect,build议用于SEO目的。 但是,如果只需要一个临时的redirect,就用Rreplace它

我发现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