从 URL 中删除 .php

Posted

技术标签:

【中文标题】从 URL 中删除 .php【英文标题】:Remove .php from URL 【发布时间】:2015-06-15 01:26:47 【问题描述】:

Ubuntu 14.04LTS 32 位

我知道这是一个老问题,但是..

我需要它从可见 url 中找到它的任何位置删除 .php。 它需要使用 /showthread.php?id=XX ---> /showthread?id=XX

我什至无法使用/page.php --> /page。 我试过这些:

Remove .php extension with .htaccess

How to hide the .html extension with Apache mod_rewrite

Remove .php from urls with htaccess

How to stop .htaccess loop

它什么都不做。 而其他.htaccess 代码工作正常..

虽然

<?php 
phpinfo();

在加载的模块中列出 mod_rewrite

<?php
 if(!function_exists('apache_get_modules') ) phpinfo(); exit; 
 $res = 'Module Unavailable';
 if(in_array('mod_rewrite',apache_get_modules())) 
 $res = 'Module Available';
?>
<html>
<head>
<body>
<p><?php echo apache_get_version(),"</p><p>mod_rewrite $res"; ?></p>
</body>
</html>

返回Module Available

尝试了更多的东西

# Apache Rewrite Rules
 <IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On
  RewriteBase /

# Add trailing slash to url
  RewriteCond %REQUEST_FILENAME !-f
  RewriteCond %REQUEST_URI !(\.[a-zA-Z0-9]1,5|/|#(.*))$
  RewriteRule ^(.*)$ $1/ [R=301,L]

# Remove .php-extension from url
  RewriteCond %REQUEST_FILENAME !-d
  RewriteCond %REQUEST_FILENAME\.php -f
  RewriteRule ^([^\.]+)/$ $1.php 

# End of Apache Rewrite Rules
 </IfModule>

#

RewriteEngine On
RewriteCond %SCRIPT_FILENAME !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]

#

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

即使这样也没有任何效果:

RewriteRule ^page$ page.php [L]

sudo service apache2 restart 不会改变任何东西。

服务器重启没有任何改变。

我尝试清除里面的其他代码,没有做任何改变。

我清除了浏览器缓存 100 次

我开始认为它只是讨厌我。这可能是什么原因造成的??

【问题讨论】:

这可能是您要匹配的内容。您是否尝试在浏览器中使用此showthread?id=XX RewriteRule 无法匹配查询字符串。所以这可能就是它不起作用的原因。你的主要目标是什么? 你看到这个问题了吗***.com/questions/21617506/… 那个答案对我也没有影响。我只是检查 example.com/page(返回 404)和 example.com/page.php(显示 .php 但有效)。如果可行的话,我已经很高兴了.. 我想我会永远沉迷于 .php :/ @anubhava 它位于php文件所在的子文件夹中。无论如何,我现在发现 Rao Asif Raza 的解决方案有效。谢谢 【参考方案1】:

希望有所帮助。

它对我有用。

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

# For LocalHost !.php
RewriteCond %HTTP_HOST !=localhost
RewriteCond %HTTP_HOST !=127.0.0.1
RewriteCond %REMOTE_ADDR !=127.0.0.1
RewriteCond %REMOTE_ADDR !=::1

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %THE_REQUEST ^[A-Z]3,\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=302,L]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

【讨论】:

干得好!那行得通!添加Options +FollowSymLinks -MultiViews 让它工作了? Also check my 4 year old answer on this topic with exact same comments as well :-) 如果更多答案有信息解释,而不仅仅是“免费”代码,那就太好了。 哇!!!浪费了 1 个小时才找到这个完美的答案.... awswome... 工作... ???【参考方案2】:

检查this link。

这是使用 .htaccess 的答案:

RewriteEngine On

# browser requests PHP
RewriteCond %THE_REQUEST ^[A-Z]3,9\ /([^\ ]+)\.php
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]

# check to see if the request is for a PHP file:
RewriteCond %REQUEST_FILENAME\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]

在带有 WAMP 的 Windows 上对其进行了测试,并且可以正常工作。

【讨论】:

是否可以不路由到网站的根目录?我将所有 php 文件放在一个子文件夹中 试试RewriteBase /subfolder 或者,尝试将.htaccess 放在您想要的子文件夹中。 我试过RewriteBase,但重写本身不起作用。无论如何,我现在发现 Rao Asif Raza 的解决方案有效。谢谢 这使我的 POST 请求失败。帖子数据似乎在重定向中丢失了。有什么解决办法吗?【参考方案3】:

试试这个从你的文件中完全删除 .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。

【讨论】:

即使在编写了正确的 RewriteBase 之后,它也不起作用 - 在访问没有“.php”扩展名的页面时,我仍然收到“404 Not Found”错误 抱歉耽搁了。刚刚检查了我的实时站点 htaccess 文件,下面的代码正在为它工作。 RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d RewriteRule 。 /index.php [L] 恐怕不行。另外,我要重写的不是“index.php” 我现在发现 Rao Asif Raza 的解决方案有效。您的解决方案只是缺少Options +FollowSymLinks -MultiViews。感谢您的帮助!【参考方案4】:

您可能走在正确的轨道上。但是,听起来您的 .htaccess 文件没有被执行。仅仅因为一个模块被激活,并不意味着它在您的特定情况下可供您使用。

以下是解决问题的一些步骤:

首先,非常仔细地检查拼写。验证拼写是否正确(包括开头的 .) 检查文件权限。一些服务器将需要可执行权限。所以 chmod 文件到 755。 如果您仍然无法使用它,请进入您的 apache 配置(在 Ubuntu 上可能位于 /etc/apache2/apache2.conf)并找到 AllowOverride 的每个实例。它可能被设置为“无”。改为AllowOverride all。 然后进入启用站点,找到您的站点配置,然后更改 AllowOverride 字段。 重新启动 Apache 服务器并用一大杯咖啡祝贺自己。

其中一个应该可以解决它。我建议在每个步骤之间进行尝试,以便您可以查明发生错误的位置。确定原因后,您可能需要返回并限制其中一些 AllowOverrides,具体取决于您的需要。

祝你好运!

【讨论】:

【参考方案5】:

您可以尝试以下方法。

RewriteEngine on
RewriteBase /
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^(.+?)/?$ $1.php$2 [L]

【讨论】:

恐怕不行。我仍然收到“404 Not Found”错误。我似乎记得以前也尝试过 @Crimbo 这个 sn-p 在本地的 xampp 中进行了测试并且运行良好,所以我猜如果需要你必须将 Rewritebase 设置为正确的文件夹。 我设置了正确的RewriteBase,但还是不行。我开始怀疑是不是Apache2服务器本身配置不正确? 我现在发现 Rao Asif Raza 的解决方案有效。感谢您的帮助!【参考方案6】:

它对我有用:

    #On rewrite
    RewriteEngine On

    # Allow any files or directories that exist to be displayed directly
    RewriteCond %REQUEST_FILENAME !-f 
    RewriteCond %REQUEST_FILENAME !-d

    # rewrite domain.com/username.php to username
    RewriteRule ^([A-Za-z0-9_-]+)/?$ $1.php [NC,L]
    RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/?$ $1/$2.php [NC,L]
    RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+)/?$ $1/$2/$3.php [NC,L]

还有更多: 查看我为 fb 等社交门户网站重写的文件:

# allow only from ip range /8 /16 /24 /31
    #Order deny,allow
    #Deny from all
    #Allow from 89.230.0.0/16

    # On rewrite
    RewriteEngine On

    # [NC]- case-insensitive 
    # [L] - Last Rule , stop the rewriting process here 
    # [OR] = Or - If it matches this condition or the next 
    # [QSA] -   Append query string to rewriting url
    # [R] - redirect [R=301] move permanently, 302 - temporarily, 403 - Forbidden, 404 - Not Found,  410 - Gone

    # fix folder redirect images and css js/images/css/media
    RewriteRule ^.+?/((img|css|js|media|upload|posts)/.+)$ /$1 [L,R=301,NC]

    # Allow any files or directories that exist to be displayed directly
    RewriteCond %REQUEST_FILENAME !-f 
    RewriteCond %REQUEST_FILENAME !-d
    # does not work on IIS windows server url rewrite when importing
    # RewriteCond %[REQUEST_FILENAME] !-l

    # rewrite example.xx/index.php na example.xx/
    RewriteCond %THE_REQUEST ^.*/index\.php 
    RewriteRule ^(.*)index\.(php|html?)$ / [R=301,NC,L]


    #portfolio rewrite folder rewrite
    # RewriteRule ^([portfolio]+)/?$ /portfolio/index.php?id=$1 [NC,L]

    # pretty url example.xx/id/post/number 
    # rewrite domain.com/username like twitter or facebook users
    RewriteRule ^([A-za-z0-9_-]+)/?$ index.php?username=$1 [NC,L]
    # domain.com/post/name
    RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/?$ profil.php?id=$1&menu=$2 [NC,L]
    # domain.com/cat/post/id
    RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/([0-9]+)/?$ profil.php?id=$1&menu=$2&page=$3 [NC,L]

    #RewriteRule ^([A-Za-z0-9_-]+)/(ustawienia)/?$ ustawienia.php?id=$1&menu=$2 [NC,L]
    #RewriteRule ^([A-Za-z0-9_-]+)/(wpisy)/?$ profil0.php?id=$1&menu=$2 [QSA,NC,L]
    #RewriteRule ^([A-Za-z0-9_-]+)/(fani)/?$ profil1.php?id=$1&menu=$2 [QSA,NC,L]
    #RewriteRule ^([A-Za-z0-9_-]+)/(ogladasz)/?$ profil2.php?id=$1&menu=$2 [QSA,NC,L]
    #RewriteRule ^([A-Za-z0-9_-]+)/(zdjecia)/?$ profil3.php?id=$1&menu=$2 [QSA,NC,L]
    #RewriteRule ^([A-Za-z0-9_-]+)/(video)/?$ profil4.php?id=$1&menu=$2 [QSA,NC,L]
    #RewriteRule ^([A-Za-z0-9_-]+)/(ulubione)/?$ profil5.php?id=$1&menu=$2 [QSA,NC,L]
    #RewriteRule ^([A-Za-z0-9_-]+)/(wiadomosci)/?$ profil6.php?id=$1&menu=$2 [QSA,NC,L]
    #RewriteRule ^([A-za-z0-9_-]+)/?$ profil.php?id=$1 [NC,L]
    #RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/?$ profil.php?id=$1&menu=$2 [NC,L]
    #RewriteRule ^([A-Za-z0-9_-]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+)/?$ index.php?id=$1&dir=$2&post=$3 [NC,L]

    # Redirect all subdomains
    # RewriteCond %HTTP_HOST ^(.*)\.breakermind\.com
    # RewriteRule ^(.*)$ http://breakermind.com/$1 [R=301,QSA,NC,L]

    # Redirect all subdomains
    # RewriteCond %HTTP_HOST ^www.ns2.breakermind.com [NC]
    # RewriteRule ^(.*)$ http://breakermind.com/$1 [R=301,QSA,NC,L]

    # RewriteCond %HTTP_HOST ^ns2.breakermind.com [NC]
    # RewriteRule ^(.*)$ http://breakermind.com/$1 [R=301,QSA,NC,L]

    # Redirect from www. to non-www (unhash if need)
    # RewriteCond %HTTP_HOST ^www.breakermind.com [NC]
    # RewriteRule ^(.*)$ http://breakermind.com/$1 [R=301,QSA,NC,L]

    # Redirect from http:// to https:// (from no-ssl to ssl)
    #RewriteCond %SERVER_PORT 80
    #RewriteRule ^(.*)$ https://breakermind.com/$1 [R=301,QSA,NC,L]


    ErrorDocument 400 /er404.html
    ErrorDocument 401 /er404.html
    ErrorDocument 402 /er404.html
    ErrorDocument 403 /er403.html
    ErrorDocument 404 /er404.html
    ErrorDocument 500 /er404.html
    ErrorDocument 502 /er404.html
    ErrorDocument 504 /er404.html

    #RewriteEngin On
    #RewriteCond %[REQUEST_FILENAME] !-d
    #RewriteCond %[REQUEST_FILENAME] !-f
    #RewriteCond %[REQUEST_FILENAME] !-l
    #RewriteRule ^(.+)$ index.php?c=$1 [QSA,L]
    #
    #        \w = [A-Za-z0-9_]  \d = [0-9]

这里来自我的博客系统:

        Options +FollowSymLinks
    RewriteEngine On

    RewriteCond %THE_REQUEST ^.*/index\.php 
    RewriteRule ^(.*)index\.(php|html?)$ / [R=301,NC,L]

    # category
    RewriteRule   ^category/?$ index.php?id=0&page=0  [NC,L]
    RewriteRule   ^category/([A-Za-z0-9]+)/?$ index.php?id=$1&page=0  [NC,L]
    RewriteRule   ^category/([A-Za-z0-9]+)/([0-9]+)/?$ index.php?id=$1&page=$2  [NC,L]
    RewriteRule   ^category/([A-Za-z0-9]+)/([0-9]+)/([A-Za-z0-9]+)/?$ index.php?id=$1&page=$2&title=$3  [NC,L]

    # autor
    RewriteRule   ^autor/?$ index.php?id=0&page=0  [NC,L]
    RewriteRule   ^autor/([A-Za-z0-9]+)/?$ index.php?id=$1&page=0  [NC,L]
    RewriteRule   ^autor/([A-Za-z0-9]+)/([0-9]+)/?$ index.php?id=$1&page=$2  [NC,L]

    # article, gallery, tags
    RewriteRule   ^article/([A-Za-z0-9]+)/?$ article.php?id=$1    [NC,L]
    RewriteRule   ^gallery/([A-Za-z0-9]+)/?$ gallery.php?id=$1    [NC,L]
    RewriteRule   ^tags/([A-Za-z0-9]+)/?$ tags.php?id=$1    [NC,L]
    RewriteRule   ^archive/([0-9]+)/([0-9]+)/?$ archive.php?year=$1&month=$2    [NC,L]

    # custom page rewrite
    RewriteRule   ^page/([A-Za-z0-9]+)/?$ page.php?id=$1    [NC,L]

    # fix folder redirect images and css js/images/css/media
    RewriteRule ^.+?/((admin|img|css|js|media|upload|posts)/.+)$ /blog/$1 [L,R=301,NC]

    # user or category user.php
    # RewriteRule   ^([A-Za-z0-9]+)/?$ index.php?user=$1  [NC,L]

    # example
    # RewriteRule ^([folder])/([category])/([A-Za-z0-9]+)/?$ index.php?id=$3&cat=$2 [NC,L]

【讨论】:

您能解释一下吗? 就像 Black Moses 所说,您能否提供一些额外的解释来说明使用什么?我尝试了第一部分,恐怕它没有用。访问带有“.php”扩展名的页面时,我仍然收到“404 Not Found”错误 # 没有 '.php' 扩展名 RewriteRule ^(.*)$ $1.php 试试这个我的例子适用于文件夹 在这种情况下我没有使用子文件夹 - 否则我可以只使用 index.php 而没有问题【参考方案7】:

假设正在处理 .htaccess,那么这个超级简单的 .htaccess 应该适合你:

RewriteEngine on
RewriteRule (.*) $1.php [END]

如果它不起作用,则说明您的 Apache 配置有问题。 你需要先调查一下。

如果可行,请在 RewriteRule 之前添加以下行以允许提供其他文件:

RewriteCond %REQUEST_FILENAME !-f

END 标志自 Apache 2.3.9 起可用。

【讨论】:

嗯,似乎正在处理 .htaccess,因为它在尝试访问索引时将“.php”添加到 URL,但对于任何其他路由都没有。所以,就像你说的,也许 Apache 配置是错误的。你知道要设置什么 Apache 配置吗?【参考方案8】:
RewriteEngine on //replacement launch
RewriteCond %REQUEST_FILENAME !-d //If the requested object is not a folder
RewriteCond %REQUEST_FILENAME\.php -f //If the requested object to append the extension php - file
RewriteRule ^(.*)$ $1.php //make the change from concatenating .php

【讨论】:

恐怕这行不通。还要小心为 cmets 使用 # 而不是 //,并且 cmets 不应共享同一行,因为它会导致 500 错误 我现在发现 Rao Asif Raza 的解决方案有效。还是谢谢你【参考方案9】:

在我的 Apache 配置中启用 mod_negotiation 对我有用:

内容协商,或更准确地说是内容选择,是从几个可用文档之一中选择最符合客户能力的文档。

【讨论】:

【参考方案10】:

它的工作,你可以试试这个代码。

1.首先在您的主目录中创建.htaccess 文件并粘贴相同的代码,然后清除您的历史记录及其工作。

RewriteEngine on

RewriteCond $1 !^(index\.php|resources|robots\.txt)

RewriteCond %REQUEST_FILENAME !-f

RewriteCond %REQUEST_FILENAME !-d

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

【讨论】:

【参考方案11】:

也许这可能是重复的,但请看一下:

How to remove .html from URL

在解决方案中,只需将html 更改为php

【讨论】:

那个解决方案对我没有效果

以上是关于从 URL 中删除 .php的主要内容,如果未能解决你的问题,请参考以下文章

htaccess - 从 url 中删除 .php 扩展名

从 URL 中删除 index.php (CodeIgniter)

无法从 codeigniter 中的 URL 中删除“Index.php”

如何从 URL 中删除 index.php?

从 URL 中删除 index.php - Codeigniter 2

从URL中删除.php