【问题标题】:How can I remove file extension from a website address?如何从网站地址中删除文件扩展名?
【发布时间】:2011-09-25 23:13:38
【问题描述】:

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

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

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

我怎样才能完成这项工作?

【问题讨论】:

标签: php url-rewriting friendly-url


【解决方案1】:

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

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

在这些页面中详细了解它的工作原理:mod_rewrite guide(介绍,使用它),reference documentation

【讨论】:

  • +1 这是要走的路,但你能解释一下这里发生了什么,以防 OP 想要理解这些行
  • 我在哪里可以阅读语法以准确了解那里发生了什么?它看起来有点像正则表达式,但我不确定?!有什么好的资源吗?
  • 在这些页面中更多关于它是如何工作的: - mod_rewrite 指南(介绍,使用它)httpd.apache.org/docs/2.4/rewrite> - 参考文档 httpd.apache.org/docs/2.4/mod/mod_rewrite.html> 有人应该将该信息添加到这个答案中(我试过到)。
  • 这对我不起作用。我能得到的最接近的是使用RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC],然后是RewriteRule ^ /%1 [NC,L,R],但最后会留下一个斜线......并且无法加载页面
【解决方案2】:

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

我在这里留下我的解决方案。这已经为我的客户和我的项目进行了多次测试和使用。它也支持多语言和语言检测。建议阅读自述文件。它还为您提供了一个良好的结构,让您拥有一个包含不同语言文件的整洁项目(您甚至可以为每种语言设计不同的设计)并将 cssjsphpfiles 分开,甚至更像 images 或任何你想要的有。

Cr8Router - Simple PHP Router

【讨论】:

    【解决方案3】:

    通过.htaccess删除文件扩展名:

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

    .htaccess 规则从 URL 中删除 .php、.html 等文件扩展名:

    RewriteRule ^(.*)$ $1.php
    

    重写后: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]
    

    【讨论】:

      【解决方案4】:

      首先,验证 mod_rewrite 模块是否已安装。然后,小心理解它是如何工作的,很多人把它弄反了。

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

      放置在您网站上的 URL 将是 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。您想这样做,以便旧的也可以工作 - 您所做的是维护一个变量始终完全相同的系统创建一个数据库表,将“SEO 友好 URL”与产品编号。一个例子可能是

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

      这样做的好处是什么?搜索引擎将索引关键字“一些很酷的视频”。自卫队?谁会去寻找它?

      我不能告诉你如何编程的细节,但是拿查询字符串,去掉结尾

      yoursite.com/Some-Cool-Video 
      

      变成“asdf”

      然后将m变量设置为这个

      m=asdf

      所以两个 URL 仍然会指向同一个产品

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

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

      【讨论】:

        【解决方案5】:

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

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

        我认为您在每个 php 文件中都包含一个菜单(可能您的菜单显示在所有网页中),因此您只能在菜单文件中添加这两行代码。这对我有用:D

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

            这是我使用的一种简单的 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 扩展名。

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                创建目录并将 index.php 保存在其中的问题在于

                1. 您的菜单链接将停止运行
                2. 目录太多了。例如,stackoverflow 上的每个问题都会有一个单独的目录

                解决方案是 1. MOD REWRITE(如上所述) 2.使用php代码动态包含索引文件中的其他文件。在这里阅读更多内容http://inobscuro.com/tutorials/read/16/

                【讨论】:

                  【解决方案10】:

                  实际上,最简单的操作方法是

                  1. 在您的服务器上打开一个新文件夹,例如“数据”
                  2. 把index.php(或index.html)放进去

                  然后 URL www.yoursite.com/data 将读取该 index.php 文件。如果您想更进一步,请在其中打开一个子文件夹(例如“List”),在该文件夹中放入另一个 index.php,然后您可以让 www.yoursite.com/data/list 运行该 PHP 文件。

                  这样您就可以完全控制它,这对 SEO 非常有用。

                  【讨论】:

                    【解决方案11】:

                    你有不同的选择。 其中一个是创建一个名为“profile”的文件夹并将“profile.php”重命名为“default.php”并将其放入“profile”文件夹中。 您可以通过这种方式向该页面下订单:

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

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

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

                    【讨论】:

                    • 有没有办法从 url 中删除 ?id=a&abc=1
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-02-24
                    • 2016-02-18
                    • 2019-02-08
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-07-12
                    相关资源
                    最近更新 更多