问题 从URL中删除.php


Ubuntu 14.04LTS 32bit

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

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

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

使用.htaccess删除.php扩展名

如何使用Apache mod_rewrite隐藏.html扩展名

使用htaccess从URL中删除.php

如何停止.htaccess循环

它什么都不做。 其他 .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次

我开始认为它只是讨厌我。有什么可能导致这个?


9126
2018-04-09 15:21


起源

这可能是你想要匹配的东西。您是否尝试在浏览器中使用此功能? showthread?id=XX RewriteRule无法匹配查询字符串。所以这可能就是为什么它不起作用。你的主要目标是什么? - Panama Jack
你看到这个问题了吗? stackoverflow.com/questions/21617506/... - starkeen
那个答案对我没有任何影响。我只是检查example.com/page(返回404)和example.com/page.php(显示.php但有效)。如果有效,我已经很高兴了.. - Myst
我想我永远都会与.php保持一致:/ - Myst
@anubhava它位于php文件所在的子文件夹中。无论如何,我现在已经找到了Rao Asif Raza的解决方案。谢谢 - Crimbo


答案:


希望有所帮助

它对我有用。

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]

6
2018-02-23 22:02



做得好!那很有效!添加 Options +FollowSymLinks -MultiViews 让它工作 - Crimbo
@myst你能试试这个解决方案,如果有效,请将其标记为已接受的答案? - Crimbo
另外,请查看关于此主题的4年回答,并提供完全相同的评论 :-) - anubhava
如果更多的答案有信息解释而不仅仅是“免费”代码,那将会很好。 - Justin


检查 这个链接

这是使用.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]

在Windows上使用WAMP进行测试并正常工作。


5
2018-02-23 16:29



适用于xampp的好例子
是否有可能没有路由到网站的根目录?我把所有的php文件放在一个子文件夹中 - Crimbo
试试吧 RewriteBase /subfolder - Condorcho
或者,试着把 .htaccess 在你想要的子文件夹中。 - Condorcho
我试过了 RewriteBase,但重写本身不起作用。无论如何,我现在已经找到了Rao Asif Raza的解决方案。谢谢 - Crimbo


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


2
2018-02-23 12:10



即使在编写了正确的RewriteBase之后,它也无法正常工作 - 访问没有'.php'扩展名的页面时仍然会收到'404 Not Found'错误 - Crimbo
抱歉耽搁了。刚刚检查了我的实时网站htaccess文件,以下代码正在为它工作。 RewriteEngine On RewriteBase / RewriteRule ^ index \ .php $ - [L] RewriteCond%{REQUEST_FILENAME}!-f RewriteCond%{REQUEST_FILENAME}!-d RewriteRule。 /index.php [L] - Siddhesh
我担心这不起作用。而且,我试图重写的不是'index.php' - Crimbo
我现在发现Rao Asif Raza的解决方案有效。你的解决方案刚刚丢失 Options +FollowSymLinks -MultiViews。感谢您的帮助! - Crimbo
哦!感谢更新 - Siddhesh


也许这可能是重复但看看这个:

如何从URL中删除.html

只是在解决方案中改变了 hmtl 对于 php


0
2018-04-09 16:03



该解决方案对我没有影响 - Myst


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

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

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

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

祝你好运!


0
2017-08-07 15:27





您可以尝试以下方法。

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

0
2018-02-21 20:25



我担心这不起作用。我仍然收到'404 Not Found'错误。我似乎记得以前也尝试过 - Crimbo
@Crimbo这个片段在xampp本地测试并且完美运行所以我猜你必须设置 Rewritebase如果需要,到适当的文件夹。 - Peter Darmis
我设置正确 RewriteBase 它仍然无法正常工作。我开始怀疑Apache2服务器本身是否配置不正确? - Crimbo
我现在发现Rao Asif Raza的解决方案有效。感谢您的帮助! - Crimbo


这个对我有用:

    #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]

0
2018-02-22 20:32



你能提供一些解释吗? - xinaiz
就像黑摩西所说的那样,你能提供一些额外的解释吗?我尝试了第一部分,我担心它不起作用。访问带有“.php”扩展名的页面时,我仍然收到“404 Not Found”错误 - Crimbo
# 无 '.php'扩展名 - Crimbo
stackoverflow.com/questions/4026021/...
RewriteRule ^(。*)$ $ 1.php尝试这个我的例子适用于文件夹


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

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

如果它不起作用,则Apache配置有问题。 你需要首先考虑一下。

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

RewriteCond %{REQUEST_FILENAME} !-f

从Apache 2.3.9开始,END标志可用。


0
2018-02-23 11:14



好吧,似乎正在处理.htaccess,因为它在尝试访问索引时将“.php”添加到URL,但不会用于任何其他路由。所以,就像你说的那样,Apache配置可能是错误的。你知道要设置什么Apache配置吗? - Crimbo
我现在发现Rao Asif Raza的解决方案有效 - Crimbo


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

0
2018-02-24 10:57



我担心这不起作用。也要小心使用 # 代替 // 对于注释,注释不应该共享同一行,因为它会导致500错误 - Crimbo
我现在发现Rao Asif Raza的解决方案有效。不管怎样,谢谢你 - Crimbo


启用 mod_negotiation模块 在我的Apache配置中为我做了诀窍:

内容协商,或者更准确地说是内容选择,是从几个可用文档中选择一个与客户端功能最匹配的文档。


0
2017-09-20 09:14