用.htaccess 删除.php 扩展名

是的,我读过阿帕奇手册,在这里搜索过。出于某种原因,我就是不能让这个起作用。最接近的方法是让它删除扩展名,但它指向根目录。我希望它只在包含 .htaccess文件的目录中工作。

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

  1. 我需要它来移除 .php

我有几个网页,使用制表符和 网址看起来像 page.php#tab-这是可能的吗?

我有一个页面,使用会话 ID 附加到网址,以确保您来自正确的地方,www.domain.example/download-software.php?abcdefg

这可能吗?在这样做的同时,我是否需要从我的头导航包含文件中的链接删除 .php?如果 IE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. 我希望它强制 www在每个 URL 之前,所以它不是 domain.example,而是 www.domain.example/page
  2. 我想删除页面中的所有尾随斜杠。

我将继续查找、尝试等等。在子目录中会导致任何问题吗?

323972 次浏览

秋葵的答案在堆栈溢出问题 如何使用 Apache mod _ rewrite 隐藏. html 扩展应工作良好。

Re 1)将. html 更改为. php

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

Re b)使用 QSA(查询字符串附加)是可能的,见下文。

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

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

Apache mod _ rewrite

你要找的是 改写,

说明: 提供要重写的基于规则的重写引擎 动态请求的 URL。

一般来说,mod_rewrite的工作原理是将请求的文档与指定的正则表达式进行匹配,然后在内部(在 Apache 进程中)或外部(在客户机浏览器中)执行 URL 重写。这些重写可以很简单,只需在内部将 example.com/foo转换为对 example.com/foo/bar的请求。

Apache 文档包括一个 mod_rewrite指南,我认为其中涵盖了您想要做的一些事情。详细的 mod _ rewrite 指南.

强制 www子域

我希望它强制“ www”之前的每个 URL,所以它不是 domain.example而是 www.domain.example/page

重写指南在 规范主机名示例中包含了这方面的说明。

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

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

我不确定您为什么要这样做,因为重写指南包括 完全相反的例子,也就是说,总是包括一个尾部斜杠。文件显示,去掉后面的斜杠很有可能引起问题:

尾随斜杠问题

描述:

每个站长都可以唱一首关于拖尾问题的歌 引用目录的 URL 上的斜杠。如果它们丢失,服务器 转储错误,因为如果说 /~quux/foo而不是 /~quux/foo/ 然后服务器搜索一个名为 foo 的文件 是一个它抱怨的目录。实际上它试图修复它自己 大多数情况下,但有时这种机制需要模仿 你。例如,在你做了很多复杂的网址 重写 CGI 脚本等。

也许您可以解释一下为什么要一直删除尾部的斜杠?

删除 .php扩展

我需要它来移除.php

我能想到的最接近这样做的方法是在内部使用。Php 扩展,即将 example.com/somepage作为对 example.com/somepage.php的请求处理。请注意,以这种方式进行操作将需要文件系统上的每个 sompage 实际上都作为 sompage.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 扩展”问题变得更加合理。

# 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

但是还有另一个选项,像这样设置 DefaultTypeDirectoryIndex指令:

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

更新2013-11-14-修正了上面的片段,将尼克雷利乌斯的观察合并在一起

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

我必须给这个解决方案的信贷是应得的,因为我发现它的 迈克尔 · J · 拉德温博客通过搜索谷歌的 无扩展阿帕奇

删除后面的斜线

一些对 apache remove trailing slashes的搜索让我看到了一些搜索引擎优化。显然,有些内容管理系统(本例中为 Drupal)会在 URL 中使用或不使用尾部斜杠来提供内容,这在搜索引擎优化世界中会导致您的站点遭受重复内容的惩罚。来源

这个解决方案看起来相当简单,我们使用 mod_rewrite在请求的资源以 /结束的条件下重写,并通过发送回 301 Permanent Redirect HTTP 头重写 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.example,并且它在标准端口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.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](强制重定向)前缀替换为 http://thishost[:thisport]/(使新 URL 成为 URI)强制执行 外部重定向。如果没有给出代码,则 HTTP 响应为302 (暂时搬走了)将被返回。

最后一点

我没能成功去除斜杠。重定向最终给了我无限的重定向循环。在仔细阅读了 最初的解决方案之后,我得到的印象是,上面的示例之所以适合他们,是因为他们的 Drupal 安装是如何配置的。他特别提到:

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

关于以斜杠结尾和不以斜杠结尾的 URL,

Drupal 使用一个名为 .htaccess的文件告诉 Web 服务器如何 这个文件支持 Drupal 的干净 URL 通过将一个简单的重定向命令添加到 .htaccess文件,可以强制服务器自动删除任何 尾部的斜线。

如果你正在用 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/

如果你的网址在 PHP 比如 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]

除了上面的其他答案,

您也可以尝试从文件中完全删除 .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 中工作, 如果希望将 RewriteBase 放到子目录中的 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 文件(例如 yoursite.example/about.php)中删除 .php扩展名到 yoursite.example/about: Open。Htaccess (创建一个新的,如果不存在)文件从您的网站根,并添加以下代码。

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

从 HTML 文件(例如从 yoursite.example/about.htmlyoursite.example/about)中删除 .html扩展名: 打开。Htaccess (创建一个新的,如果不存在)文件从您的网站根,并添加以下代码。

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

参考资料: 如何从 URL 中删除 PHP 扩展

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

Online-public _ html/

如果它工作不正确,然后改变您的 Wamp 设置 服务器: 1)左键单击 WAMP 图标2) Apache 3) Apache 模块4)左键 单击 rewrite _ module

这个之后,在 /etc/apache2/apache2.conf(Debian 8)中将参数 AllowOverrideNone更改为 All之后,。Htaccess 文件必须包含:

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

而且它足以在文件中隐藏.php 扩展名

下面是我用来对文件名隐藏 .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]