我陷入了一个大难题,不过让我先从其中的一部分开始解决。
我想知道为什么这有效:
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]