Как перенаправить "/" в "/home.html", только если файл "/index.html" не существует физически? - PullRequest
0 голосов
/ 15 сентября 2010

Я нашел способ перенаправить (не загружать, а изменить URL) "/" на "/home.html".И теперь я хочу добавить RewriteCond, чтобы избежать перенаправления, если файл "/index.html" существует.

Я пытался (без комментариев), но это не сработало:

# We check that we comes from "domain.tld/"
RewriteCond %{REQUEST_URI} =/

# We check that there is no index.html file at the site's root
RewriteCond %{REQUEST_URI}index\.html !-f

# We redirect to home.html
RewriteRule ^(.*)$ %{REQUEST_URI}home\.html [R=301,L]

Помоги мне, Оби-ван Кеноби ... Ты моя единственная надежда!


@ Гамбо

Это немного сложнее, чемприведенный выше пример.Фактически, я управляю как локальным, так и производственным развитием с помощью одного и того же .htaccess, поэтому я попробовал что-то вроде этого (следуя вашему ответу):

# Redirect domain.tld/ to domain.tld/home.html (only if domain.tld/index.html does not exists)
RewriteCond %{DOCUMENT_ROOT}index\.html !-f [OR]
RewriteCond %{DOCUMENT_ROOT}domain.tld/www/index\.html !-f
RewriteRule ^$ %{REQUEST_URI}home\.html [R=301,L]

Я посмотрел путь, возвращенный доменом "% {DOCUMENT_ROOT}.tld / www / index.html "и это точно путь к моему файлу index.html ... тем не менее, он тоже не сработал.: (

Кстати, спасибо за "^ $", чтобы избежать "% {REQUEST_URI} = /"! \ O /

Есть идеи, почему?

Ответы [ 3 ]

1 голос
/ 15 сентября 2010

если у вас есть доступ к httpd.conf (конфигурационный файл apaches), вы можете установить там страницу по умолчанию.

Примерно так:

<IfModule dir_module>  
    DirectoryIndex index.html home.html
</IfModule>
1 голос
/ 15 сентября 2010

Проверка файла -f требует допустимого пути к файловой системе. Но %{REQUEST_URI}index\.html - это не путь файловой системы, а путь URI. Вместо этого вы можете использовать -F, чтобы проверить существование с помощью подзапроса. Или используйте DOCUMENT_ROOT , чтобы создать правильный путь к файловой системе:

RewriteCond %{DOCUMENT_ROOT}/index.html !-f
RewriteRule ^$ %{REQUEST_URI}home.html [R=301,L]

Кроме того, другое условие может быть выполнено с шаблоном RewriteRule. Поскольку вы используете mod_rewrite в файле .htaccess, соответствующий префикс пути удаляется (в случае корневого каталога документа: /), поэтому оставшийся путь представляет собой пустую строку (соответствует ^$).

0 голосов
/ 21 сентября 2010

Исходя из набора правил, который вы опубликовали в своем обновлении, у вас происходит небольшая логическая ошибка. Прямо сейчас одно из ваших RewriteCond условий всегда будет верным, поскольку кажется вероятным, что оба индексных файла никогда не будут существовать в одной и той же среде (один существует в разработке, другой в работе). Поскольку вы ИЛИ соединили их вместе, это означает, что ваш RewriteRule никогда не будет проигнорирован из-за блока условий.

Это достаточно просто исправить (я также добавил дополнительные косые черты, так как DOCUMENT_ROOT обычно не имеет завершающего слеша ):

RewriteCond %{DOCUMENT_ROOT}/index.html !-f
RewriteCond %{DOCUMENT_ROOT}/domain.tld/www/index.html !-f
RewriteRule ^$ %{REQUEST_URI}home.html [R=301,L]

Также обратите внимание, что вы можете настроить виртуальный хост с локальным именем хоста, чтобы ваши разработки и производство были похожи с точки зрения относительных путей.

...