启用 mod 重写后,如何强制使用 htaccess 清除 URL?

问题描述 投票:0回答:1

我尝试在启用 mod 重写时,htaccess 将所有页面从

.php
重定向到
.html
。但我也希望在后台,服务器在收到
.php
请求时“提供”
.html
文件。

例如,我访问我的网站

example.com/folder/file.html
,因此服务器应该渲染
/folder/file.php
并发送它。但如果我在浏览器中写入
example.com/folder/file.php
,我希望服务器将我重定向到
example.com/folder/file.html
,然后运行 php 代码。

我希望这样,当启用 mod_rewrite 时,我的网站将具有 .html 扩展名,但当它被禁用时,它将使用 .php 扩展名。

我尝试做的是:

RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)\.html$ $1.php [L]

RewriteRule ^(.*)\.php$ $1.html [R=307]

但它会引发无限循环。

php apache .htaccess clean-urls
1个回答
0
投票

为了实现所需的行为,您需要确保您的规则不会创建无限循环。您当前的规则正在导致循环,因为这两个规则可以应用于同一请求,从而导致 .php 和 .html 之间的连续重定向。

这是 .htaccess 文件的更新版本,以避免无限循环:


    Options +FollowSymLinks
    RewriteEngine On
    
    # Prevent internal redirect for existing files and directories
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    
    # Rewrite .html to .php internally
    RewriteRule ^(.*)\.html$ $1.php [L]
    
    # Redirect external requests from .php to .html
    RewriteCond %{THE_REQUEST} \.php
    RewriteRule ^(.*)\.php$ $1.html [R=307,L]

说明:

  1. 第一个

    RewriteCond
    检查请求的文件或目录是否不作为服务器上的物理文件或目录存在。

  2. 第二个

    RewriteCond
    检查请求的文件是否不作为服务器上的物理文件存在。

  3. 第一个

    RewriteRule
    在内部将请求从.html重写为.php,而不重定向浏览器。
    [L]
    标志表示如果满足条件,这是要处理的最后一条规则。

  4. 第二组条件(

    RewriteCond
    RewriteRule
    )检查请求是否包含.php。如果是这样,它将浏览器重定向到相应的 .html 文件。
    [R=307,L]
    标志执行临时 (307) 重定向并停止处理进一步的规则。

有了这些规则,您应该能够实现所需的行为,而不会导致无限循环。

© www.soinside.com 2019 - 2024. All rights reserved.