#.htaccess #url #redirect #mod-rewrite
#.htaccess #url #перенаправление #мод-перезапись
Вопрос:
У меня очень специфические требования к обработке URL-адресов, и я не могу понять, как объединить все это.
Если пользователь откроется http://example.com/abc123
, мне нужны следующие изменения:
http://
тогда должно статьhttps://
…- …открыть
https://example.com/abc123.php
, если файлabc123.php
существует - …открыть
https://example.com/abc123/index.php
, если каталог/abc123/
существует - …открыть
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, я пометил этот ответ как сообщество, поэтому, если вы хотите отредактировать его своим ответом, я не получу никакой репутации, но будущие читатели смогут извлечь уроки из вашего опыта.