为什么我不能将包含“index.html”的 URL 重定向到 php 文件?

为什么我不能将包含“index.html”的 URL 重定向到 php 文件?

我陷入了一个大难题,不过让我先从其中的一部分开始解决。

我想知道为什么这有效:

RewriteRule ^(.*)index.html $1 [R=301,L]

而这不行:

RewriteCond %{REQUEST_FILENAME} index\.html [NC]
RewriteRule ^(.*) main.redirect.php [QSA,L]

这个也不起作用:

RewriteRule ^(.*)index.html main.redirect.php [NC,QSA,L]

有任何想法吗?

我将其作为主要问题的一部分,客户希望我只针对以下一个或所有条件执行一次重定向

  • 缺少 www(将其放在前面)
  • index.html 在最后(删除它)
  • 存在大写字母(转换为小写字母)

为了实现这一点,我创建了一个 php 文件,它可以一次性完成所有这些操作,并且我需要在上述任一条件下调用它(然后 php 文件将执行重定向):

<?php
$sURL = $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
echo '$sURL = ' . $sURL . '<br />';
$sURL = strtolower($sURL);
if (substr($sURL, 0, 4) != 'www.') {
    $sURL = 'www.' . $sURL;
}
if (substr($sURL, -10) == 'index.html') {
    $sURL = substr($sURL, 0, -10);
}
echo 'Location: http://' . $sURL;
#header('Location: http://' . $sURL, true, 301);
?>

(echo 行用于测试目的,稍后将被删除并激活 header() 命令)

在 .htaccess 文件中,我现在有以下内容(位于“RewriteEngine On”和“Options +FollowSymlinks”之后):

    # 2014-07-16 RM: Exclude these files from rewriting
    RewriteRule \.(js|ico|gif|jpg|jpeg|png|css|pdf)$ - [NC,QSA,L]

    # 2014-07-16 RM: Check if the url starts with www
    RewriteCond %{HTTP_HOST} ^mydomain\.com [NC]
    RewriteRule ^(.*) main.redirect.php [QSA,L]

    # 2014-07-16 RM: Check if the url ends with index.html
#    RewriteCond %{SCRIPT_FILENAME} ^(.*)index\.html$ [NC]
#    RewriteRule ^(.*) main.redirect.php [QSA,L]
    RewriteRule ^(.*)index.html main.redirect.php [NC,QSA,L]

    # 2014-07-16 RM: Check if the url contains upper-case characters
#    RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]
#    RewriteRule ![A-Z] - [E=HASCAPS:FALSE,S=1]
#    RewriteCond %{ENV:HASCAPS} TRUE
#    RewriteRule ^(.*) main.redirect.php [QSA,L]

任何帮助都将不胜感激!

亲切的问候

雷内

编辑:

我将 .htaccess 部分精简为几行,但即使在这种情况下,也只有 www-check 能按预期工作:

RewriteCond %{HTTP_HOST} ^mydomain\.com [NC,OR]
RewriteCond %{REQUEST_URI} ^(.*)/index\.html$ [NC,OR]
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^(.*) main.redirect.php [QSA,L]

答案1

我还没有测试过这个,但是我发现的第一件事是在你的 RewriteRule 行中是这样的:

RewriteRule ^(.*) main.redirect.php [QSA,L]

您应该尝试在 main.redirect.php 前添加一个斜线,因为重定向规则的那部分应该是一个 URL,所以它会变成:

RewriteRule ^(.*) /main.redirect.php [QSA,L]

相关内容