2017-02-15 4 views
0

Кажется, каждые несколько недель я должен задать еще несколько вопросов .htaccess для переписывания/перенаправления. Каждый раз, когда я думаю, что понимаю, в мой проект бросается другой ключ, который показывает, что я этого не делаю.Комплекс (?) Htaccess переписывание/перенаправление

EDIT: Мой первоначальный вопрос был не очень ясен, поэтому следующая попытка быть более кратким.

Как все это, все файлы .html живут в корневом каталоге. например: http://example.com/about.html

Там нет никаких подкаталогов, за исключением нормальных, как IMG, CSS и т.д.

Для целей отслеживания, если кто-то типы в http://example.com/random/, где «случайный» может быть любая строка Я хочу, чтобы они увидели файл index.html, не изменяя URL. Каталог «random» вообще не существует на сервере.

То же самое касается других страниц, таких как about.html. Если кто-то напечатает в http://example.com/random/about.html, я бы хотел, чтобы они увидели страницу about.html.

В то же время, я хотел бы http://example.com/random/about или http://example.com/about (отсутствует расширение файла), чтобы также показать о странице.

Однако, если кто-то напечатал страницу, которая не существует, я хотел бы, чтобы это использовать пример ErrorDocument

: У меня нет файла с именем «pickups.html», так что следующее бы все ошибки 404:

http://example.com/pickups.html 
http://example.com/pickups 
http://example.com/random/pickups.html 
http://example.com/random/pickups 

было бы неплохо, если бы конец перенаправлять/переписывание было иметь расширение файла отгоняют (потому что он выглядит лучше).

Мои мысли, что любой запрос, заканчивающийся /, будет просто служить в файле index.html, который существует в корне сайта. Таким образом, это оставляет файлы.

Мой мыслительный процесс:

  • полоса расширение файла от запроса
  • проверки, существует ли файл с расширением в корневом каталоге сайта
  • если да, показывать эту страницу.
  • если нет, 404.

Мой исходный код (имел справку о нем) был таков:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+)/(.*)$ /$2 [R=301,L] 

Я понимаю, что в этом коде я захватывая все после последнего слеша и сервировки это из корня документа. К сожалению, он не учитывает файлы, которые не существуют.

+0

Тестирование может быть легко сделано с помощью локальной установки Apache. Добавьте PHP, чтобы посмотреть на среду, но большую часть времени достаточно простого Apache. –

+1

Изучив это, я должен признать, что я даже не понимаю, чего вы хотите. Я предлагаю разбить его на более мелкие кусочки и решить вашу проблему шаг за шагом. –

+0

У меня есть локальная установка Apache - или XAMPP. Что вы подразумеваете под простым Apache? Прошу прощения, если я не проясняю. Что-нибудь конкретное, что вы повесили трубку, я могу пролить свет? – gin93r

ответ

2

Начиная с существующих файлов, они будут переданы без изменений. Это также предотвращает переписывание циклов.

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule^- [L] 

Далее следует существующим файлы, запрашиваемые в рамках опционного, виртуального подкаталог

RewriteCond %{DOCUMENT_ROOT}/$2 -f 
RewriteRule ^(.+/)?(.+)$ /$2 [L] 

RewriteCond %{DOCUMENT_ROOT}/$2.html -f 
RewriteRule ^(.+/)?(.+)$ /$2.html [L] 

Это разбивает запрос в опциональные префиксы (.+/)? и файловой часть. Если эта часть файла существует, возможно, с добавлением .html, все готово.

Далее идет что-нибудь с слэш, просто переписать index.html

RewriteRule /$ /index.html [L] 

Что-нибудь еще будет запрос для несуществующих файлов, которые дают код на 404 статус.


Для того, чтобы удалить дополнительный .html расширение и удалить дополнительный завершающий слэш / для существующих файлов, мы должны вставить два правила в начале

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteCond %{DOCUMENT_ROOT}/$2.html -f 
RewriteRule ^(.+/)?(.+?)\.html/?$ /$1$2 [R,L] 

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteCond %{DOCUMENT_ROOT}/$2.html -f 
RewriteRule ^(.+/)?(.+?)/$ /$1$2 [R,L] 

Эти правила аналогичны другим правилам, за исключением того, что они переадресовывают R|redirect вместо перезаписи и имеют дополнительное условие для предотвращения перезаписи.


Собираем все вместе дает

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteCond %{DOCUMENT_ROOT}/$2.html -f 
RewriteRule ^(.+/)?(.+?)\.html/?$ /$1$2 [R,L] 

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteCond %{DOCUMENT_ROOT}/$2.html -f 
RewriteRule ^(.+/)?(.+?)/$ /$1$2 [R,L] 

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule^- [L] 

RewriteCond %{DOCUMENT_ROOT}/$2 -f 
RewriteRule ^(.+/)?(.+)$ /$2 [L] 

RewriteCond %{DOCUMENT_ROOT}/$2.html -f 
RewriteRule ^(.+/)?(.+)$ /$2.html [L] 

RewriteRule /$ /index.html [L] 
+0

Это замечательно. Два быстрых вопроса. Возможно ли иметь необязательную конечную косую черту для страниц, для которых существует _do_? Я попробовал добавить '/?' Ко второму условию: 'RewriteRule^(. + /)? (. +) /? $/$ 2 [L]', но это, похоже, не изменило ситуацию. Так как 'about.html' существует,' http: // example.com/ about/'будет показывать эту страницу. И это всего лишь любопытство. Если я наберу 'http: // example.com/about.html', он будет переименован в' http: // example.com/ about', что идеально. Однако 'http: // example.com/random/about.html' не переименовывается. Он отображается правильно, хотя. Что вызывает это? – gin93r

+0

Перенаправление (переименование) должно выполняться каким-либо другим правилом в вашем текущем файле htaccess. Я не включил такие правила в свой ответ. Переадресовываете ли вы все запросы .html или только для существующих файлов? –

+0

Weird. Единственные правила, которые у меня есть в моем htaccess, - это те, которые вы предоставили. Раньше у меня были другие правила, но я не думал, что такие вещи будут кэшироваться или что-то еще ... – gin93r

Смежные вопросы