使用mod_rewrite删除.php扩展名

时间:2011-02-05 16:44:22

标签: apache mod-rewrite

我想要一个mod_rewrite规则集,所以我可以引用一个没有.php扩展名的页面,但是要重写它以包含php扩展名。这将在1& 1服务器上运行。

有没有好的参考资料,所以我可以自己了解更多?

8 个答案:

答案 0 :(得分:53)

RewriteEngine On
RewriteRule something something.php [L]

http://example.com/something将被视为something.php

的请求

非物理文件的所有请求重定向到相同的名称,但使用.php:

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

答案 1 :(得分:12)

上面接受的答案不会从网址中删除.php扩展名,只允许您在没有扩展名的情况下访问.php个文件。要从网址中完全删除.php扩展程序,您可以在root/.htaccess中使用以下规则:

RewriteEngine on

#1)externally redirect "/file.php" to "/file"   
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
#2)Internally map "/file" back to "/file.php"
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,L]

答案 2 :(得分:4)

你真正想要的只是一种没有后缀的方法。该 我发现这样做的最好方法是在.htaccess或in中使用Files指令 apache配置文件:

<Files myscript>
   SetHandler cgi-script
</Files>

这避免了重写的一些缺点,例如,直接访问.php 文件。

答案 3 :(得分:2)

.htaccess文件:添加以下行:

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

https://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/

现在您必须检查apache2.log文件中的AllowOverride条件: 在您的Web根目录中设置选项 AllowOverRide All

    Options Indexes FollowSymLinks  
    AllowOverride All  
    Require all granted

如果您尝试访问没有.php扩展名的网页,则可能会在apache error.log文件中遇到以下错误:     /var/www/html/web/.htaccess:无效的命令'RewriteEngine',可能拼写错误或由服务器配置中未包含的模块定义

要解决此问题:您没有安装mod_rewrite模块,要安装它: 运行以下命令:ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

.htaccess: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration

同样,在刷新网页后,您可能会在error.log文件中收到以下错误:

[negotiation:error] [pid 4650] [client 127.0.0.1:46461] AH00687: Negotiation: discovered file(s) matching request: /var/www/html/web/test (None could be negotiated). (I was trying to access localhost/web/test.php using the url: localhost/web/test)

要修复它,你必须在apache2.conf中添加以下行:

<IfModule mod_mime.c>
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .html
AddType application/x-httpd-php-source .phps

https://forums.digitalpoint.com/threads/htaccess-addtype-application-x-httpd-php-php-htm-html-and-maybe-a-fix.7584/#post-2491687

现在,我只使用文件名:test

来访问test.php文件

答案 4 :(得分:1)

此选项将制作干净的SEO友好URL。从可见URL中删除.php扩展名,并确保在没有.php的情况下访问URL仍将显示.php文件。我无法找到在多个线程上实现此目的的另一个答案。

请记住启用mod重写。在Debian或Unbuntu linux上,以下内容可以正常工作

sudo a2enmod重写

sudo service apache2 restart

将apache2.conf文件的相应部分修改为以下内容。

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule (.*) $1.php [L]
        RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
        RewriteRule ^ /%1 [NC,L,R]
</Directory>

如果使用.htaccess重写,请确保apache2.conf至少启用了这些选项。

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        RewriteEngine On
</Directory>

最后在某些Apache安装上,您可能还需要设置 AllowOveride All 在/ etc / apache2 / sites-available中的.conf文件或/ etc / apache2 / sites-enabled中 据传,重写apache2.conf文件而不是.htaccess更快。

答案 5 :(得分:0)

http://example.com/test链接http://example.com/test.php,请使用:

2.1 - Apps that crash will be rejected

答案 6 :(得分:0)

由于某种原因,我无法使任何其他解决方案正常工作。我把它放在我网站根目录的.htaccess文件中。希望这对你有用。

RewriteEngine on #only use this once per .htaccess
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

请务必记住,如果您的标头或网址包含.php扩展名,则不会将其删除。您需要删除扩展程序。

使用此...

header 'location: /login';

而不是......

header 'location: /login.php';

答案 7 :(得分:0)

对于指导几个单个文件,可能更容易避免使用RewriteEngine。

我已经用过了:

<Files $filename>
   SetHandler application/x-httpd-php
</Files>

这不如重写那么强大和灵活,但可能更快,如果您希望将一些特定文件作为PHP处理,这似乎是要走的路。