apache 使用mod_rewrite删除.php扩展名

cyej8jka  于 2022-11-16  发布在  Apache
关注(0)|答案(9)|浏览(172)

我想要一个mod_rewrite规则集,这样我就可以引用一个没有.php扩展名的页面,但是要重写它以包含.php扩展名。这将在1&1服务器上运行。
有没有好的参考资料,这样我可以学到更多的自己?

rlcwz9us

rlcwz9us1#

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

dgjrabp22#

上面被接受的答案不会从URL中删除.php扩展名,它只允许您访问没有扩展名的.php文件。要从URL中完全删除.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]
brgchamk

brgchamk3#

也许你真正想要的只是一种完全没有后缀的方法,我发现的最好的方法是在.htaccess或apache配置文件中使用Files指令:

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

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

s4chpxco

s4chpxco4#

.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文件中遇到以下错误:访问:命令'RewriteEngine'无效,可能拼写错误或由未包含在服务器配置中的模块定义
要解决此问题,请执行以下操作:您没有安装mod_rewrite模块,要安装它:运行以下命令:/etc/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/apache2/
.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
</IfModule>

https://forums.digitalpoint.com/threads/htaccess-addtype-application-x-httpd-php-php-htm-html-and-maybe-a-fix.7584/#post-2491687
现在,我可以只使用文件名来访问test.php文件:试验,测验

zsohkypk

zsohkypk5#

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

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

请记住,如果您的标头或URL包含.php扩展名,它将不会被删除。您需要删除该扩展名。
用这个...

header 'location: /login';

而不是这样。

header 'location: /login.php';
qkf9rpyu

qkf9rpyu6#

此选项将使干净的SEO友好的URL。从可见的URL中删除. php扩展名,并确保没有.php访问的URL仍将显示.php文件。我无法找到另一个答案,在多个线程上实现这一点。
记住启用mod重写。在Debian或Unbuntu linux上可以使用以下命令
sudo a2 enmod重写

sudo服务apache 2重新启动
将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安装中,您可能还需要在/etc/apache 2/sites-available或/etc/apache 2/sites-enabled中的.conf文件中设置AllowOveride All
据说从apache2.conf文件重写比从.htaccess文件重写更快。

9lowa7mx

9lowa7mx7#

要获取http://example.com/test链接http://example.com/test.php,请用途:

RewriteEngine on
RewriteRule ^([^\.]+)$ /folder/$1.php [NC,L]
rbl8hiat

rbl8hiat8#

对于定向几个单个文件,避免RewriteEngine可能更容易。
我用过这个:

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

这没有重写那么强大和灵活,但可能更快,如果你只想把几个特定的文件作为PHP处理,这似乎是一条路。

cngwdvgl

cngwdvgl9#

RewriteEngine On

# Redirect sites with no extension to .php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule .* %{REQUEST_URI}.php

这就是我想出的。这是基于被接受的答案和它的评论。

相关问题