У меня есть какая-то сложная проблема, которую я пытаюсь решить. Я использовал следующую директиву .htaccess, чтобы включить какие-то красивые URL-адреса, и это сработало. Например, http://myurl.com/shop будет перенаправлен на http://myurl.com/index.php/shop, и это хорошо работало (обратите внимание, что такие вещи, как myurl.com/css/mycss.css) не перенаправляются:
RewriteEngine on
RewriteCond ${REQUEST_URI} !^(index\.php$)
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^/?(.*)$ index.php/$1 [L]
Но теперь, когда я ввел SSL на свою веб-страницу, мне нужно следующее поведение: я в основном хочу вышеуказанное поведение для всех страниц, кроме admin.php и login.php. Запросы к этим двум страницам должны быть перенаправлены в часть HTTPS, тогда как все остальные запросы должны обрабатываться, как указано выше.
Я придумал следующий .htaccess, но он не работает. часtps: //myurl.com/shop не перенаправляется на htp: //myurl.com/index.php/shop и htp: //myurl.com/admin.php не перенаправляется на htps: //myurl.com/admin.php.
RewriteEngine on
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^(admin\.php$|login\.php$)
RewriteRule ^(.*)$ http://%{HTTP_HOST}/${REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^(admin\.php$|login\.php$)
RewriteRule ^(.*)$ https://myurl.com/%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_URI} !^(index\.php$)
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^/?(.*)$ index.php/$1 [L]
Я знаю, что это как-то связано с правилами, перезаписывающими друг друга, но я не уверен, поскольку мои знания об Apache весьма ограничены. Как я могу исправить эту, очевидно, не такую уж сложную проблему, и как я могу сделать свой .htaccess более компактным и элегантным?
Помощь очень ценится, спасибо!
Я должен ответить таким образом, потому что моя временная учетная запись (то есть файл cookie) потеряна. Во всяком случае, я нашел кое-что интересное.
Я исправил проблему с ведущим / в REQUEST_URI, о которой вы мне говорили.
Я ввел директивы RewriteLog и RewriteLogLevel в глобальную конфигурацию Сервера (которая должна применяться к HTTP И HTTPS, верно?).
Затем я обнаружил, что все HTTP-запросы обрабатывались правильно и по желанию (!), Как я видел в журнале, но запросы с HTTPS вообще не регистрировались! Поэтому я предполагаю, что либо ведение журнала настроено неправильно, ИЛИ (и этого я опасаюсь), что запросы по HTTPS даже не проходят процедуру mod_rewrite.
Еще раз, я использую файл .htaccess, чтобы установить правила перезаписи.
Итак, настоящая проблема сейчас заключается в том, что все, что происходит через HTTP, правильно переписывается, но когда у меня есть такой запрос, как https://myurl.org/shop, Я хочу, чтобы его перенаправили на http://myurl.org/shop, потому что это не admin.php и не login.php.
И я не понимал, что такое «(на самом деле, нет необходимости в отдельном RewriteCond)». Спасибо!
Ниже мой обновленный файл .htaccess.
RewriteEngine on
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/(admin\.php$|login\.php$)
RewriteRule ^(.*)$ http://%{HTTP_HOST}${REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/(admin\.php$|login\.php$)
RewriteRule ^(.*)$ https://myurl.org%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_URI} !^/(index\.php$)
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^/?(.*)$ index.php/$1 [L]