【问题标题】:htaccess rewrite if redirected file exists如果存在重定向文件,则 htaccess 重写
【发布时间】:2011-03-25 19:10:29
【问题描述】:

问题:一些 php 等效的 html 页面(apple.html、apple.php;orange.html、orange.php),但不是所有的都可以(grapes.html)。

目标:如果存在php版本,则重写,否则保持html版本。

我有:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)\.html$ /$1.php [R]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.php$ /$1.html [R]

有趣的问题:

如果我不把 / 放在 $1.php 前面,那么我最终会得到:site.com/document/root/path(即:site.com/home/user/www/file.php)

当调用第二个 RewriteRule 时,我得到 http://site.com/http:/site.com/page.html,它告诉我重定向太多。注意第二个 http 中只有一个 /。

我已经取得了一些进展,我添加了 RewriteBase / 并删除了 $1 之前的 /,但我仍然收到过多重定向错误(site.com/page.html 上的网页导致重定向过多。清除此站点的 cookie 或允许第三方 cookie 可能会解决问题。如果没有,可能是服务器配置问题,而不是您的计算机问题。

似乎如果我只是重写 html -> php -> html 我会得到同样的错误。所以看起来逻辑是有效的,但这种逻辑是不允许的。我想不出任何其他方法可以查看文件的“php 版本”是否存在?我能想到的唯一方法是做类似的事情:

RewriteCond ^(.*)\.html$ $1.php -f
RewriteRule ^(.*)\.html$ $1.php [R]

不幸的是,这不太有效(我猜是因为它在条件行上有三个部分)。我正在尝试获取不带扩展名的文件名,然后说如果 filename.php 是一个文件,请将 page.html 重写为 page.php

【问题讨论】:

    标签: php .htaccess rewrite


    【解决方案1】:

    您应该能够通过使用两个条件来实现:

    RewriteCond %{REQUEST_FILENAME} (.*)\.html$
    RewriteCond %1\.php -f
    RewriteRule ^(.*)\.html$ $1.php [R,L]
    

    第一个条件检查文件名是否以 .html 结尾,第二个条件使用第一个条件中的反向引用 %1 来检查 .php 版本是否存在。

    希望对您有所帮助。 :)

    【讨论】:

    • 当我第一次看到你的邮件时,我就像啊哈!然后我尝试了它,但无济于事:(即使存在 php,它仍然会转到 page.html。您是否偶然在第二个 RewriteCond 上表示 $1 而不是 %1?
    • 我刚刚在我的 apache 上进行了测试,它可以工作。您使用的是 httpd.conf 还是 .htaccess?如果还有其他规则,您会发布所有重写规则吗? % 符号应该用在 RewriteCond 中,$ 用在 RewriteRule 中,至少这是我记得的。 :)
    【解决方案2】:

    我还想将所有 .html 请求重写为 .php 文件,但前提是 .php 文件存在。但我的变化是,只有在实际的 .html 文件不存在时才会发生这种情况。

    所以只有对不存在的 .html 文件的调用才会被重写为 .php 文件,如果它们确实存在这些规则:(我还在 XAMP 本地服务器和 Apache 在线服务器上成功测试了这个!)

    # Rewrite rules to .html file to .php if the .php version
    # does actually exist.
    
    RewriteCond %{REQUEST_FILENAME} (.*)\.html [NC]
    RewriteCond %{REQUEST_FILENAME} !-f [NC]
    RewriteCond %1\.php -f [NC]
    RewriteRule ^(.*).html$ $1.php [NC]
    
    1. 它首先检查请求的文件是否为 .html 文件(我们不希望 .jpg、.css、.pdf 等被重写)。
    2. 它会检查该 .html 文件是否不存在。 (如果确实存在,我们不想重写为 .php。)
    3. 然后它会检查 .php 版本是否存在(我们不想重写到不存在的 .php 文件)。
    4. 然后将.html重写为.php

    【讨论】:

      【解决方案3】:

      很抱歉回答得太晚了,但您需要添加 RewriteBase 指令才能使其正常工作。

      我遇到了同样的问题(使用您的 http:/stufff)并以这种方式修复了它:

      RewriteBase   /your/application_path
      RewriteCond %{REQUEST_FILENAME} (.*)\.html$
      RewriteCond %1\.php -f
      RewriteRule ^(.*)\.html$ $1.php [L]
      

      希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 2011-09-12
        • 1970-01-01
        • 2015-09-23
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 2019-11-23
        • 2016-02-28
        • 1970-01-01
        相关资源
        最近更新 更多