如何在地址栏中删除文件扩展名


How to keep file extension removed in address bar?

我正在使用以下代码从URL中删除.php扩展:

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

我的问题是如何像堆栈溢出一样将其删除。如果我的URL是domain.com/about.php,它会重定向到domain.com/about,但如果有人故意在about之后键入.php,它会保留在那里。此外,如果有人直接访问domain.com/about.php,它仍然保留在那里。即使用户有意键入,我如何才能像stackoverflow那样从URL中删除任何扩展?如果这在.htacess中无法完成,我可以用JavaScript或PHP完成吗?

尝试:

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)'.php [NC]
RewriteRule ^ %1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME}'.php -f
 RewriteRule ^(.*)$ $1.php [NC,L]

这将重定向

http://example.com/file.php

http://example.com/file

然后重写:

http://example.com/file

http://example.com/file.php

使用Apache Web服务器时为干净URL进行魔术重写:

这个过程包括几个步骤。你应该觉得自己像个忍者,因为你想这样做,并付出额外的努力。这是值得的!

将.htaccess文件放在您正在工作的文件夹中:(例如,如果您在目录/company/中工作,则将其放在/company/.htaccess中)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L,QSA]

因此,我们现在在您的服务器上有了一个路径,如果它不存在,它将接受其中的任何内容。例如,如果你指向/company/Joe_Plumber,它会重定向到index.php。如果你指向了/company/style.css,并且它存在并且具有正确的权限,它会给你想要的文件。

在该目录中创建一个index.php文件(例如/company/index.php

现在,在php文件中,您必须处理用户的请求。Basename只会给你最后一个文件夹,所以如果我们请求/company/foo/bar,它只会得到bar

$q = basename($_SERVER['REQUEST_URI']);
$q = str_replace('_',' ',$q); // Convert any underscores to spaces
echo "Hi, {$q}!";

仅此而已。如果有什么我可以澄清或帮助的方法,请询问。