.htaccess правила перезаписи для нескольких обращений

#.htaccess #url #redirect #mod-rewrite

#.htaccess #url #перенаправление #мод-перезапись

Вопрос:

У меня очень специфические требования к обработке URL-адресов, и я не могу понять, как объединить все это.

Если пользователь откроется http://example.com/abc123 , мне нужны следующие изменения:

  1. http:// тогда должно стать https://
  2. …открыть https://example.com/abc123.php , если файл abc123.php существует
  3. …открыть https://example.com/abc123/index.php , если каталог /abc123/ существует
  4. …открыть https://example.com/index.php?abcdef , т.е. использовать abc123 в качестве параметра в обычном index.php

Для 2. — 4. Мне нужно, чтобы URL-адрес в адресной строке оставался https://example.com/abc123 .

Пока у меня есть следующее в моем .htaccess , которое, я полагаю, заботится о 1. и 2.:

 RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L]
  

Комментарии:

1. Спасибо за приятную детализацию. Один вопрос, в конечном счете, из url http://example.com/abc123 , на который URL в серверной части вы хотите указать? Пожалуйста, дайте нам знать.

2. Ну, это зависит от того, какие файлы и папки есть: если существует следующее: example.com/abc123.php . Если этого не существует, но если существует следующее: example.com/abc123/index.php . И, наконец, если ни один из них не существует: example.com/index.php?abcdef

Ответ №1:

Передо мной нет сервера Apache, но работает ли это для последних трех?

 # Look for URL.php as a file
RewriteCond %{REQUEST_URI}.php -f
RewriteRule ^(.*)$ $1.php [L]

# Look for URL as a directory
RewriteCond %{REQUEST_URI} -d
RewriteRule ^(.*)$ /$1/index.php [L]

# If the URL doesn't exist on disk in another way that Apache can
# figure out, forward it to index.hp
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [QSA,L]
  

РЕДАКТИРОВАТЬ: хорошо работает следующее:

 RewriteEngine On

# http:// -> https://
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

# -> https://example.com/abc123.php if that file exists
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [END]

# -> index.php if /abc123.php and /abc123/ don't exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ / [END]
  

Комментарии:

1.К сожалению, это не так. Следующее почти работает. За исключением example.com сам по себе, что вызывает «Ошибка 404 — объект не найден» RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [END] RewriteCond %{REQUEST_FILENAME}/index.php -f RewriteRule ^(.*)$ $1/index.php [END] RewriteRule ^(.*)$ index.php [END] (sry для ужасного форматирования ^^)

2. Можете ли вы разбить каждое условие и протестировать каждое вручную, чтобы увидеть, что нужно изменить?

3. По сути, все, чего не хватает, это if example.com/abc123 is NOT a folder, redirect to example.com/index.php (without changing the url in the address bar, so I can still read abc123 with Javascript) .

4. RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [END] К сожалению, ЭТО ВСЕГДА перенаправляет на example.com/index.php , даже если есть каталог с именем /abc123

5. @TonaldDrump, я пометил этот ответ как сообщество, поэтому, если вы хотите отредактировать его своим ответом, я не получу никакой репутации, но будущие читатели смогут извлечь уроки из вашего опыта.