如何从网站地址中删除文件扩展名?

时间:2011-06-30 12:41:16

标签: php url-rewriting friendly-url

我正在设计一个网站。我希望我的网站地址如下图所示:

file name extensions like (PHP/JSP) are hidden

我不希望我的网站看起来像http://something.com/profile.php 当有人打开我的网站时,我希望在地址栏中删除.php个扩展名。换句话说,我希望我的网站像:http://something.com/profile

作为第二个例子,您可以查看StackOverflow网站本身。

有人可以帮助我完成这项工作吗?谢谢!

11 个答案:

答案 0 :(得分:72)

只需将.htaccess文件添加到您网站的根文件夹(例如/home/domains/domain.com/htdocs/),其中包含以下内容:

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

答案 1 :(得分:13)

首先,验证是否已安装mod_rewrite模块。然后,要小心了解它是如何工作的,很多人都会倒退。

您不会隐藏网址或扩展程序。你所做的是创建一个指向旧网址的新网址,例如

您网站上的网址为yoursite.com/play?m=asdf

或更好

yoursite.com/asdf

即使目录asdf不存在。然后安装mod_rewrite,将其放在.htaccess中。基本上它说,如果请求的URL不是文件而不是目录,请将其指向我的脚本:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /play.php [L] 

差不多完成了 - 现在你只需要在PHP脚本中写一些东西来解析新的URL。你想这样做,以便OLD也可以工作 - 你所做的是维护一个系统,变量总是完全相同 OR 创建一个数据库表,将“SEO友好URL”与产品ID。一个例子可能是

/ Some-Cool-Video(等于产品ID asdf)

这样做的好处是什么?搜索引擎会将关键词“Some Cool Video”编入索引。 ASDF?谁会去搜索?

我不能告诉你如何编程这个,但是拿出查询字符串,剥去结束

yoursite.com/Some-Cool-Video 

变成“asdf”

然后将m变量设置为此

m = asdf

因此,两个网址仍然会转到同一个产品

yoursite.com/play.php?m=asdf 
yoursite.com/Some-Cool-Video 

mod_rewrite也可以做很多其他重要的事情,谷歌为它,并在你的服务器上激活它(它可能已经安装。)

答案 2 :(得分:4)

你有不同的选择。 其中一个是创建一个名为“profile”的文件夹,并将“profile.php”重命名为“default.php”并将其放入“profile”文件夹中。 你可以用这种方式命令这个页面:

旧网页:http://something.com/profile.php?id=a&abc=1

新页面:http://something.com/profile/?id=a&abc=1

如果您不满意,请对复杂方法发表评论。

答案 3 :(得分:2)

创建目录并在其中保留index.php的问题是

  1. 您的菜单链接将停止运作
  2. 会有太多目录。例如,stackoverflow上的每个问题都会有一个单独的目录
  3. 解决方案是 1. MOD REWRITE(如上所述) 2.使用php代码动态地在索引文件中包含其他文件。在这里阅读更多内容http://inobscuro.com/tutorials/read/16/

答案 4 :(得分:2)

这是我使用的一种简单的PHP方式 如果使用.php扩展名请求页面,则会生成一个没有.php扩展名的新请求。然后,浏览器的地址字段中不再显示.php扩展名。

我提出了这个解决方案,因为很多.htaccess建议都没有对我有用,而且在PHP中实现它比在试图找出.htaccess无法在我的服务器上运行的原因更快。

将它放在每个PHP文件的开头(最好先于其他任何东西):

include_once('scripts.php');  
strip_php_extension();  

然后将这些函数放在'scripts.php'文件中:

//==== Strip .php extension from requested URI  
function strip_php_extension()  
{  
  $uri = $_SERVER['REQUEST_URI'];  
  $ext = substr(strrchr($uri, '.'), 1);  
  if ($ext == 'php')  
  {  
    $url = substr($uri, 0, strrpos($uri, '.'));  
    redirect($url);  
  }  
}  

//==== Redirect. Try PHP header redirect, then Java, then http redirect
function redirect($url)  
{  
  if (!headers_sent())  
  {  
    /* If headers not yet sent => do php redirect */  
    header('Location: '.$url);  
    exit;  
  }  
  else  
  {
    /* If headers already sent => do javaScript redirect */  
    echo '<script type="text/javascript">';  
    echo 'window.location.href="'.$url.'";';  
    echo '</script>';  

    /* If javaScript is disabled => do html redirect */  
    echo '<noscript>';  
    echo '<meta http-equiv="refresh" content="0; url='.$url.'" />';  
    echo '</noscript>';  
    exit;  
  }  
}  

显然,您仍然需要设置Apache以将没有扩展名的任何请求重定向到具有扩展名的文件。 上面的解决方案只是检查请求的URI是否有扩展名,如果它请求没有扩展名的URI。然后Apache使用扩展名重定向到文件,但只有请求的URI(没有扩展名)显示在浏览器的地址字段中。 优点是代码中的所有“href”链接仍然可以具有完整的文件名,即包括.php扩展名。

答案 5 :(得分:1)

实际上,操纵这个的最简单方法是

  1. 在您的服务器上打开一个新文件夹,例如“数据”
  2. 将index.php(或index.html)放入其中
  3. 然后网址www.yoursite.com/data将读取index.php文件。如果你想进一步,打开一个子文件夹(例如“List”),在该文件夹中放入另一个index.php,你可以让www.yoursite.com/data/list运行该PHP文件。

    通过这种方式,您可以完全控制这一点,对SEO非常有用。

答案 6 :(得分:1)

与Igor相同,但应该在没有第2行的情况下工作:

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

答案 7 :(得分:1)

通过.htaccess删除文件扩展名

原始网址:http://ravinderrathore.herobo.com/contact.php

htaccess规则从网址中删除.php,.html等文件扩展名。

RewriteRule ^(.*)$ $1.php

After Rewriting: http://ravinderrathore.herobo.com/contact

RewriteEngine on

RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/

RewriteRule ^index(.*)?$ index.php$1 [L,QSA]

RewriteRule ^login_success(/)?$ login_success.php [L,QSA]

RewriteRule ^contact(/)?$ contact.php [L,QSA]

答案 8 :(得分:1)

Tony,你的脚本没问题,但如果你有100个文件?需要在所有这些中添加此代码:

  

include_once( 'scripts.php');
  strip_php_extension();

我认为你在每个php文件中都包含一个菜单(可能你的菜单显示在你的所有网页中),所以你只能在菜单文件中添加这两行代码。这项工作对我来说:D

答案 9 :(得分:0)

与第一个答案几乎相同,但更有优势。

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

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

如果您的网站中有其他文件扩展名,只需加起来

答案 10 :(得分:0)

对于那些仍在寻找简单答案的人;您可以使用.htaccess删除文件扩展名,但是这种解决方案只是节省了一天的时间。因为当用户从地址栏中复制URL或尝试重新加载甚至从历史回来时,您的标准Apache路由器将无法意识到您要查找的内容并抛出404 Error。为此,您需要一个专用的路由器,以通过说服务器和文件系统不知道的内容来使您的应用了解URL的实际含义。

我在这里留出我的解决方案。我的客户和我的项目都经过多次测试和使用。它也支持多种语言和语言检测。建议使用自述文件。它还为您提供了一个良好的结构,使您的项目整洁,其中包含不同的语言文件(每种语言甚至可以有不同的设计),并且cssjsphp文件的分隔更像images或其他任何东西。

Cr8Router - Simple PHP Router