Страницы

Поиск по вопросам

Показаны сообщения с ярлыком .htaccess. Показать все сообщения
Показаны сообщения с ярлыком .htaccess. Показать все сообщения

четверг, 9 апреля 2020 г.

.htaccess - обращение к файлам отличного формата

#htaccess

                    
На хостинге находятся множество файлов со следующими именами:


  index.php.html
  index.php_cat=1.html
  index.php_product=1.html
  index.php_view=content.html
  pages.php_view=order.html
  pages.php_view=register.html
  price.php.html


Нужно сделать так, чтоб при обращении в браузере по линкам, тянулся контент с этих
файлов. Линки в браузере соответственно:


  mydomain.com/index.php
  mydomain.com/index.php?cat=1
  mydomain.com/index.php?product=1
  mydomain.com/index.php?view=content
  mydomain.com/pages.php?view=order
  mydomain.com/pages.php?view=register
  mydomain.com/price.php

    


Ответы

Ответ 1



Требуемую задачу выполняет следующая конструкция: RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} !^$ RewriteRule ^(.*\.php)$ $1_%{QUERY_STRING}.html? [L,R=301,NC] RewriteCond %{QUERY_STRING} ^$ RewriteRule ^(.*\.php)$ $1.html [L,R=301,NC] Если же требуется, чтобы адрес в строке браузера не менялся, нужно просто убрать директиву редиректа R=..., т.е. содержимое файла будет следующим: RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} !^$ RewriteRule ^(.*\.php)$ $1_%{QUERY_STRING}.html? [L,NC] RewriteCond %{QUERY_STRING} ^$ RewriteRule ^(.*\.php)$ $1.html [L,NC]

Как правильно сделать редирект через .htaccess?

#php #htaccess

                    
Как правильно сделать редирект через .htaccess?

RewriteEngine On
RewriteBase /
RewriteRule ^([a-zA-Z0-9_-]+)$ page.php?go=profile&id=$1
RewriteRule ^audio([0-9]+)$ page.php?go=audio&id=$1


Как сделать такой страницы site.ru/abc и site.ru/audio123




Получаю только Profile. А как получить Profile или Audio?
    


Ответы

Ответ 1



В первом правиле проверить наличие audio RewriteRule ^(?!audio)([a-zA-Z0-9_-]+)$ page.php?go=profile&id=$1 RewriteRule ^([a-zA-Z0-9_-]+)$ page.php?go=profile&id=$1 либо поменять местами условия RewriteRule ^audio([0-9]+)$ page.php?go=audio&id=$1 RewriteRule ^video([0-9]+)$ page.php?go=video&id=$1 RewriteRule ^photo([0-9]+)$ page.php?go=photo&id=$1 RewriteRule ^([a-zA-Z0-9_-]+)$ page.php?go=profile&id=$1

воскресенье, 29 марта 2020 г.

Как устранить ошибку 403?

#linux #htaccess #битрикс #веб_сервер #хостинг


Есть выделенный сервер на CentOS 7 на котором хостится муниципальный сайт на битриксе.
Проблема в том, что сайт (в основном, по ночам) становится не доступен и судя по логам
Nginx выдаёт ошибку 403. "Ложится" он на время от 5 до 50 минут и потом сам "поднимается".
Доступ для пользователей к директории с битрексом есть на чтение и запись. htaccess
(на сколько я могу судить) стандартный битрексовский. Наименование файлов корректное.
Думал, что это может быть из-за бэкапов, но "ложится" сайт по времени рандомно. Подскажите,
пожалуйста, что может быть?
    


Ответы

Ответ 1



Требуется для начала исследовать кто выдает ошибку 403: Nginx/Apache или PHP-код. Найти это можно в логах nginx/apache и по заголовкам ответа (X-Powered-By). Далее требуется разбиратся с логами конкретного сервера nginx/apache (и искать в логе ошибок причину ошибки 403) либо при выдаче этого кодом php - разбиратся в нём

Ответ 2



Нашёл причину (точнее, помог коллега). Оказалось, всё было в банальном фишинге сайта (использовали rk.php для перенаправления на свои сайты). По этой причине, сервер временно блокировал балансировщик пересылающий эти запросы серверу. Решается это всё в настройках Битрикса. Нужно зайти в интерфейс Битрикса, в раздел меню "Проактивная защита", дальше в "Защита редиректов" и включить защиту редиректов. Битрикс будет подписывать ссылки через rk.php.

пятница, 13 марта 2020 г.

Как правильно включить сжатие файлов?

#htaccess #apache2


Как правильно настроить gzip в Apache?

Для чего нужна эта конструкция - IfModule mod_deflate.c?
Что выполняет этот пункт - BrowserMatch?

Настройка в .htaccess



Так?


AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml
text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html



или просто так?

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

    


Ответы

Ответ 1



Для чего нужна эта конструкция - IfModule mod_deflate.c? Проверяет, активирован ли необходимый модуль mod_deflate. Что выполняет этот пункт - BrowserMatch Позволяет задать поведение на основе заголовка user-agent. Используется для установки env-переменных, которые использует Apache. Как правильно прописать настройки? Использовать комбинацию из двух процитированных вариантов. Раз уж в первом варианте делается проверка одного из используемых модулей, пусть делается проверка и для второго. AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html Данный фрагмент файла .htaccess проверяет наличие модуля mod_deflate и, если он доступен, включает сжатие для перечисленных типов файлов. После этого идет проверка наличие модуля mod_setenvif и, если он доступен, изменяются параметры сжатия для некоторых браузеров, которые некорректно обрабатывают сжатые файлы.

среда, 4 марта 2020 г.

Как сделать ЧПУ через .htaccess или другим способом

#htaccess #apache #mod_rewrite


Здравствуйте, подскажите как сделать ЧПУ через .htaccess или другим способом. На
данный момент пытаюсь реализовать через .htaccess, но что-то не так.

Ситуация такая что использую одну точку входа через index.php, может это как-то влияет. 

Вот .htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !=on 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule ^([a-z]+)/([a-z]+)/$ ?country=$1®ion=$2&city=$3 [QSA,L]
RewriteRule .* index.php [L]

    


Ответы

Ответ 1



Если у вас уже единая точка входа (это хорошо) и нет зависимости от .htaccess (это хорошо), то не надо добавлять зависимость от .htaccess и терять достоинства единой точки входа: весь роутинг в одном месте, независимость от сервера. Разбирайте ваш URL прямо в index.php. Подробнее: Как сделать всё и сразу в mod_rewrite? P. S. Не могу закрыть как дубликат вопрос под конкурсом. P. P. S. Уже ничего не помню про .htaccess, но в вашем коде, вроде, проблема в том, что все преобразования повешены на одно условие.

Ответ 2



.htaccess проходится повторно, если были изменения строки запроса условиями. Осторожнее с .* иначе все запросы будут попадать именно туда. Можно использовать [END] для остановки повторного прохода. [L] останавливает парсинг, но не отменяет повторный проход

понедельник, 24 февраля 2020 г.

Как прописать редирект в .htaccess если изменился домен?

#htaccess #redirect #домен #mod_rewrite #поддомены


Есть старый сайт на поддомене, например 2015.site.ru

поменяли основной домен site.ru на 2015.site.moscow

теперь нужно чтобы все обращения к 2015.site.ru переадресовывались на 2015.site.moscow

И естественно, не только обращения только к инденсу домена, но и любые другие, например
чтобы http://2015.site.ru/images/pic.gif преобразовывался в http://2015.site.moscow/images/pic.gif

Однако при обращение к основному сайту site.ru не должно быть переадресации на site.moscow
Подскажите пожалуйста, как такое прописать в .htaccess?
    


Ответы

Ответ 1



просто классика. скопировано из ответа: rewriteengine on rewritecond %{HTTP_HOST} ^a\.example\.com rewriterule ^(.*)$ http://b.example.com/$1 [r,l] доп. информация: http://wiki.apache.org/httpd/WhenNotToUseRewrite

Ответ 2



Если ограничиваться только протоколом HTTP, то необходимый редирект можно записать, например, так: RewriteEngine On RewriteCond %{HTTP_HOST} ^2015\.site\.ru$ RewriteRule ^(.*)$ http://2015.site.moskow/$1 [R=301,L] Если надо таким же образом перенаправлять и протокол HTTPS, то правило будет немного посложнее: RewriteEngine On RewriteCond %{HTTP_HOST} ^2015\.site\.ru$ [NC] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ http://2015.site.moskow/$1 [R=301,L] RewriteCond %{HTTP_HOST} ^2015\.site\.ru$ [NC] RewriteCond %{HTTPS} on RewriteRule ^(.*)$ https://2015.site.moskow/$1 [R=301,L] Это правило понятно, но избыточно и сделано слишком прямолинейно. Можно его оптимизировать, убрав повторяющиеся элементы. В результате получится следующее: RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ - [env=protocol:http] RewriteCond %{HTTPS} on RewriteRule ^(.*)$ - [env=protocol:https] RewriteCond %{HTTP_HOST} ^2015\.site\.ru$ [NC] RewriteRule ^(.*)$ %{ENV:protocol}://2015.site.moskow/$1 [R=301,L] Интересно, что мне не удалось найти онлайн-тестер файла .htaccess, понимающий последний вариант. Но "живой" Apache обработал его корректно.

среда, 5 февраля 2020 г.

ЧПУ и .htaccess

#apache #htaccess #php


Скажу сразу, что я почти в этом не разбираюсь. Необходимо сделать ЧПУ. Урлы типа
http://domein.com/model.php?id=(название латиницей) нужно перевести в урлы типа http://domein.com/model/(название
латиницей). В файле .htaccess выглядит так полностью:
php_flag register_globals on
ErrorDocument 404 /error.html

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{HTTP_HOST} ^domein.com

RewriteRule (.*) http://www.domein.com /$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://domein.com / [R=301,L]

RewriteRule ^ model/(.+)$ model.php?id =$1 [R]

И вот если ставить ключ [R] в последней строке, то редирект выполняется, т.е. в поле
адреса забиваешь http://domein.com/model/a страница находиться, но при этом урл меняется
на прежний http://domein.com/model.php?id=a. И когда из http://domein.com/search.php
идет обращение к http://domein.com/model.php?id=a, урл сам не меняется на http://domein.com/model/a,
хоть ты тресни.
С ключами отличными от [R]: либо [L], либо [QSA], либо их комбинации или же совсем
без ключа; страница http://domein.com/model/a находиться и урл фиксируется, так что
пользователь может его видеть. НО как и в случае с [R], урл сам не меняется на http://domein.com/model/a.
И самое страшное что не грузятся картинки и невозможно перейти на другие ветки сайта,
даже если менять img src="images/img.jpg" на img src=" domein.com/images/img.jpg" в
итоге картинка имеет путь http://domein.com/model/domein.com/images/img.jpg, также
и все страницы имеют ссылки вида http://domein.com/model/index.php вместо http://domein.com/index.php
при обращении из изменённого урла к index.php.
Наверно немного запутанно, но смысл думаю понятен. Задача сделать рабочими ЧПУ, так
чтобы новые урлы формировались из уровня выше и при этом сохранялись в поле адреса.
И чтобы нормально грузились все картинки и пути были соответственно рабочими.
Повторюсь, я профан в этом деле и делаю только первые шаги в познании PHP. Так что
просьба громко не смеяться. Буду благодарен за любой ответ.    


Ответы

Ответ 1



RewriteEngine on RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*)$ /index.php?route=$1 [L,QSA] Ну а в скрипте уже разгребайте $_REQUEST['route']

Ответ 2



RewriteRule ^model/([A-Za-z]+)$ model.php?id=$1 [L] Чем не устроит такой редирект? Соответственно для циферок: RewriteRule ^model/([0-9]+)$ model.php?id=$1 [L] Успехов!

среда, 29 января 2020 г.

Объяснение кода: убрать расширение php в конце url

#htaccess


Объясните, пожалуйста, код. А если есть ошибки, то исправьте. Этот код для того чтоб
в конце url убиралось расширение php. Да кстати, ещё скажите как добавлять сайты для
убирания расширения.
.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
    


Ответы

Ответ 1



RewriteEngine on //Запускаем движок замены RewriteCond %{REQUEST_FILENAME} !-d //если запрашиваемый объект не папка RewriteCond %{REQUEST_FILENAME}\.php -f //если запрашиваемый объект с дописанным расширением php - файл RewriteRule ^(.*)$ $1.php //делаем замену с дописыванием .php В этом коде неправильно сделаны комментарии, поэтому он и не работает. Комментарии должны писаться отдельной строкой до каждой инструкции и перед ними должен ставится знак #. Правильно нужно делать так: # Запускаем движок замены RewriteEngine on # Если запрашиваемый объект не папка RewriteCond %{REQUEST_FILENAME} !-d # если запрашиваемый объект с дописанным расширением php - файл RewriteCond %{REQUEST_FILENAME}\.php -f # делаем замену с дописыванием .php RewriteRule ^(.*)$ $1.php В этом случае, инструкции будут работать вместе с комментариями.

Ответ 2



RewriteEngine on //Запускаем движок замены RewriteCond %{REQUEST_FILENAME} !-d //если запрашиваемый объект не папка RewriteCond %{REQUEST_FILENAME}\.php -f //если запрашиваемый объект с дописанным расширением php - файл RewriteRule ^(.*)$ $1.php //делаем замену с дописыванием .php

Ответ 3



.htaccess AddDefaultCharset UTF-8 RewriteEngine on RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L] RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" RewriteRule .* - [L,R=404] index.php

вторник, 28 января 2020 г.

Что значит директива RewriteCond?

#htaccess #apache #веб_программирование


Что значит это - RewriteCond в Apache?

А конкретнее это это значит, если не трудно, разложите по полочкам, а то моему мозгу
трудно воспринять эту информацию. 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d


Что это значит? - Если запрашиваемая в URL директория или файл существуют обращаемся
к ним напрямую документации
    


Ответы

Ответ 1



Эти директивы задают условия для следующей после них директивы RewriteRule. Т.е. сами по себе они не применяются, после них должна идти директива, на которую они влияют RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^index.php [L] В частности !-f требует, чтобы правило RewriteRule применялось только в том случае, если запросу не соответствует физически существующий файл, а !-d - запрос не должен применяться, если запрашивается физически существующая папка. Таким образом, правило в RewriteRule, следующее за этими директивами будет касаться только виртуальных URL для которых нет папки или файла на диске сервера.

воскресенье, 26 января 2020 г.

Настройка vagrant\apache?

#apache #htaccess #vagrant


Поднял Vagrant с Apache и PHP. Конфиг делал через сайт puphpet.com. Залил проект,
но есть проблемы с доступом к файлам из папки files.
Часть структуры папок:

site/.code - .php
site/files - файлы


Также имеется файл site/files/.htaccess :

php_value engine off


Если попробовать открыть через браузер любой файл из папки files или files/dir/dir
, то вернется 500 ошибка, но если .htaccess удалить, то файлы грузятся.
До этого сидел на OpenServer там таких проблем не было.
Конфиг apache c virtualhost:


  ServerName default

  DocumentRoot "/var/www/html"

  
    Options Indexes FollowSymlinks MultiViews
    AllowOverride All
    Require all granted

    
      Require all granted
      SetHandler proxy:fcgi://127.0.0.1:9000
    

  

  ErrorLog "/var/log/apache2/default_vhost_80_error.log"
  ServerSignature Off
  CustomLog "/var/log/apache2/default_vhost_80_access.log" combined 



$ apachectl -M
Loaded Modules:

 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 actions_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgid_module (shared)
 dav_module (shared)
 dav_fs_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_fcgi_module (shared)
 proxy_http_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 mpm_worker_module (shared)

    


Ответы

Ответ 1



Смотри что я сделал 1) поставил sudo apt-get install libapache2-mod-php5 если он уже установлен, тогда сначала удали его sudo apt autoremove libapache2-mod-php5, потом установи еще раз. 2) перезапусти apache командой sudo systemctl restart apache2 Он должен выдать ошибку "Job for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details." 3) зайди в папку /etc/apache/mods-enabled и удали два файла @mpm_worker.conf и @mpm_worker.load 4) перезапусти apache еще раз sudo systemctl restart apache2 В списке модулей у тебя должна появтся новая строчка в списке подключенных модулей core_module (static) so_module (static) watchdog_module (static) http_module (static) log_config_module (static) logio_module (static) version_module (static) unixd_module (static) access_compat_module (shared) actions_module (shared) alias_module (shared) auth_basic_module (shared) authn_core_module (shared) authn_file_module (shared) authz_core_module (shared) authz_groupfile_module (shared) authz_host_module (shared) authz_user_module (shared) autoindex_module (shared) cgid_module (shared) dav_module (shared) dav_fs_module (shared) deflate_module (shared) dir_module (shared) env_module (shared) filter_module (shared) mime_module (shared) mpm_prefork_module (shared) negotiation_module (shared) php7_module (shared) proxy_module (shared) proxy_fcgi_module (shared) proxy_http_module (shared) reqtimeout_module (shared) rewrite_module (shared) setenvif_module (shared) socache_shmcb_module (shared) ssl_module (shared) Под название mpm_prefork_module и исчезнуть mpm_worker_module (shared) Это проблем с многопоточностью и совместимотью модулей mpm_worker и mpm_prefork

.htaccess переадресация с папки на поддомен

#php #htaccess #apache #redirect #apache2


Подскажите как сделать так, чтобы при заходе по адресу http://site.com/sub или http://www.site.com/sub
переадресовывало на http://sub.site.com?

В корневом каталоге располагается файл .htaccess с содержимым


Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
ErrorDocument 400 /index.php?route=error/_400
ErrorDocument 401 /index.php?route=error/_401
ErrorDocument 403 /index.php?route=error/_403
ErrorDocument 404 /index.php?route=error/_404
ErrorDocument 500 /index.php?route=error/_500
RewriteCond %{HTTP_HOST} ^site\.com$
RewriteRule ^sub/(.*)$ http://sub.site.com/$1 [L,R=301]
RewriteRule ^sub$ http://sub.site.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?route=$1 [L,QSA]


В папке sub располагается файл .htaccess с похожим содержимым


Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
ErrorDocument 400 /index.php?route=error/_400
ErrorDocument 401 /index.php?route=error/_401
ErrorDocument 403 /index.php?route=error/_403
ErrorDocument 404 /index.php?route=error/_404
ErrorDocument 500 /index.php?route=error/_500
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]


Так же имеется вопрос, можно ли как то из папки sub в файле .htaccess обратиться
к файлу из корневой директории, например, RewriteRule ^style/([@.A-Za-z0-9-/+_=]+)$
../library/styles/$1 [L] ?


Пытаюсь сделать следующее


Options -Indexes
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
ErrorDocument 400 /index.php?route=error/_400
ErrorDocument 401 /index.php?route=error/_401
ErrorDocument 403 /index.php?route=error/_403
ErrorDocument 404 /index.php?route=error/_404
ErrorDocument 500 /index.php?route=error/_500
#
RewriteCond %{ENV:REDIRECT_VHOST} ^$
RewriteCond %{HTTP_HOST} ^(www\.)?sub\.site\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ sub/index.php?route=$1 [L,E=VHOST:1]
#
RewriteCond %{HTTP_HOST} ^site\.com$
#RewriteRule ^sub/(.*)$ http://sub.site.com/$1 [L,R=301]
#RewriteRule ^sub$ http://sub.site.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]


Не работает перенаправление с site.con/sub на sub.site.com (циклическая переадресация),
а так же при переходе, например, на sub.site.com/abc - ошибка 500, кто знает, что нужно
исправить?
    


Ответы

Ответ 1



В файле .htaccess нужно прописать: Redirect 301 /sub http://sub.site.com

Ответ 2



Не рекомендовал бы использовать в домене www, его сейчас мало кто использует: RewriteEngine On RewriteCond %{HTTP_HOST} !^www\..* [NC] RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R=301] И решение Вашей проблемы будет выглядеть так: Redirect /sub http://sub.site.com Redirect http://www.site.com/sub http://sub.site.com

пятница, 24 января 2020 г.

Как делать перенаправление с site.ru/ на site.ru/ru/

#php #htaccess #mod_rewrite


Как делать перенаправление с site.ru/ на site.ru/ru/

Пробовал так:

RewriteRule ^(.*)/$ /ru/ [L]


Выдает ошибку 500

А так:

RewriteRule ^(.*)/$ /ru/ [R=301,L]


Ругается что переадресацию много раз делаю
    


Ответы

Ответ 1



чтоб не было циклической переадресации, можно проверять, что url не начинается с /ru/ RewriteCond %{REQUEST_URI} !^/ru/ RewriteRule ^(.*)$ /ru/$1 [R=301,L]

Ответ 2



RewriteCond %{HTTP_HOST} ^site.ru$ [NC] RewriteRule ^(.*) http://site.ru/ru/$1 [R=301,L]

При чтении файла Warning: file_get_contents(files/..): failed to open stream: Permission denied

#php #htaccess


Пытаюсь зачитать файлы из папки,пишу следующее

  


Ответы

Ответ 1



Замени $entries = scandir($dir,1); на $entries = array_diff(scandir($dir, 1), array('..', '.'));

суббота, 11 января 2020 г.

Как запретить ходить по каталогам на сайте

#php #веб_программирование #htaccess


Всех приветствую,есть сайт как запретить пользователям ходить по каталогам ну например
открыл сайт попал на index.php и допустим он ввел в адресную строку index.php/images
и допустим его перебросило на страницу с ошибкой можно так сделать ??
    


Ответы

Ответ 1



Как вариант можно спрятать важные файлы в отдельную директорию. Можно реализовать запрос на ввод пароля к примеру. Но выше верно сказали, копайте в сторону .htaccess Вот вам пару ссылок на эту тему, с примерами и документацией: Что такое .htaccess и с чем его есть? 25 Правил которые вам лучше знать об .htaccess Старая добрая вики, для общего развития

Ответ 2



В папке к которой хочешь запретить доступ размести файл .htaccess Deny from all

четверг, 2 января 2020 г.

На каком языке программирования написан .htaccess?

#htaccess


apache как я понял написан на языке C. Если htaccess элемент apache, то тоже на C?
    


Ответы

Ответ 1



Файлы .htaccess написаны на языке, не являющимся языком программирования; используется синтаксис конфигурационных файлов сервера Apache, чьи элементы называются директивами. Список директив приведён на сайте Apache. См. также статью Википедии.

понедельник, 16 декабря 2019 г.

Как убрать дубли страниц?

#php #htaccess


Привет всем!

Сейчас страница доступна и по такому адресу site.loc/page/2 и по такому site.loc/index.php?view=page&page_id=3.
Движок самописанный.

.htaccess

RewriteEngine On
RewriteRule ^page/(\d+)/?$ index.php?view=page&page_id=$1


Вопрос такой: как мне убрать дубликаты через .htaccess или php? Если кратко, то надо
сделать редирект с site.loc/index.php?view=page&page_id=3 на site.loc/page/2.
    


Ответы

Ответ 1



RewriteCond %{HTTP_HOST} ^index.php$ RewriteRule ^index.php?view=(.*)&page_id=(.*)$ http://site.loc/$1/$2 [L,R=301] Как-то так, но тут вопрос как по мне должен быть как раз в СЕО части, так как тот момент что страница доступна по нескольких адресам не является проблемой, но вот то что поисковые системы их индексируют отдельно - уже проблема. Как написал комментатор выше rel=canonical решит проблему! К примеру движок OpenCart очень сильно грешит тем что можно к странице обратиться по ЧПУ, по полному пути с категорией и постом через ГЕТ, и напрямую по ИД записи, и при этом канонический путь очень сложно правельно настроить.

воскресенье, 15 декабря 2019 г.

Почему съедает слеш в скобочной группе регулярного выражения?

#php #регулярные_выражения #htaccess


.htaccess

RewriteRule ^activation-account/(.+)/login([a-zA-Z0-9_]+)$ web/index.php?r=registration/activation-register/activation&key_active=$1&key_login=$2 [L]


Переходим по ссылке
http://myhost//activation-account/$2y$10$Xl40W/SKTOXYcxfCxGszr.9tbd//lNJSVJTpBh4umjWf/9GNMSlJy/loginfiko

Ловим переменную в php key_active

Она возвращает:
$2y$10$Xl40W/SKTOXYcxfCxGszr.9tbd/lNJSVJTpBh4umjWf/9GNMSlJy

То есть на этом промежутке 9tbd/l убирается слеш а должно быть так 9tbd//l
    


Ответы

Ответ 1



Вот рабочий вариант редиректа для Apache: RewriteEngine On RewriteCond %{REQUEST_URI} ^/*activation-account/(.+)/login(\w+)$ RewriteRule .* web/index.php??r=registration/activation-register/activation&key_active=%1&key_login=%2 [L] В переменных запроса он ни чего не имеет против двойного слеша. UPD + мой ответ на вопрос: Как сделать всё и сразу в mod_rewrite?

Ответ 2



Мне кажется, тут проблема не в регулярном выражении а в том как apache обрабатывает URL, а точнее в web-стандартах. Условно говоря любое количество слешей всегда читается как один слеш. Например http://myhost/activation-account http://myhost//activation-account http://myhost///activation-account и http://myhost////////////activation-account это путь к одной и той-же странице. Правельный путь решить эту проблему - использовать urlencode/urldecode или base64

суббота, 7 декабря 2019 г.

Редирект url на нижний регистр

#htaccess #apache #mod_rewrite


Подскажите, как корректно настроить через файл .htaccess 301 редирект на нижний регистр
ссылок в таком рЕгИсТре?
Спасибо!
    


Ответы

Ответ 1



На одном из проектов ставил в htaccess 2 правило отсюда, но сейчас опробовал и первый вариант: Добавляем в файл виртуального хоста запись: RewriteMap lc int:tolower После чего, добавляем следующие записи в .htaccess: RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} ^[^A-Z]*[A-Z].* RewriteRule ^ ${lc:%{REQUEST_URI}} [L,R=301] Второй вариант подобный правил: RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} [A-Z] RewriteRule (.*) ${lc:$1} [R=301,L] Способ 2 — наиболее громоздкий, но не требующий доступа к настройкам Apache. Достаточно добавить правила в .htaccess: RewriteEngine On RewriteBase / # If there are caps, set HASCAPS to true and skip next rule RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1] # Skip this entire section if no uppercase letters in requested URL RewriteRule ![A-Z] - [S=28] # Replace single occurance of CAP with cap, then process next Rule. RewriteRule ^([^A]*)A(.*)$ $1a$2 RewriteRule ^([^B]*)B(.*)$ $1b$2 RewriteRule ^([^C]*)C(.*)$ $1c$2 RewriteRule ^([^D]*)D(.*)$ $1d$2 RewriteRule ^([^E]*)E(.*)$ $1e$2 RewriteRule ^([^F]*)F(.*)$ $1f$2 RewriteRule ^([^G]*)G(.*)$ $1g$2 RewriteRule ^([^H]*)H(.*)$ $1h$2 RewriteRule ^([^I]*)I(.*)$ $1i$2 RewriteRule ^([^J]*)J(.*)$ $1j$2 RewriteRule ^([^K]*)K(.*)$ $1k$2 RewriteRule ^([^L]*)L(.*)$ $1l$2 RewriteRule ^([^M]*)M(.*)$ $1m$2 RewriteRule ^([^N]*)N(.*)$ $1n$2 RewriteRule ^([^O]*)O(.*)$ $1o$2 RewriteRule ^([^P]*)P(.*)$ $1p$2 RewriteRule ^([^Q]*)Q(.*)$ $1q$2 RewriteRule ^([^R]*)R(.*)$ $1r$2 RewriteRule ^([^S]*)S(.*)$ $1s$2 RewriteRule ^([^T]*)T(.*)$ $1t$2 RewriteRule ^([^U]*)U(.*)$ $1u$2 RewriteRule ^([^V]*)V(.*)$ $1v$2 RewriteRule ^([^W]*)W(.*)$ $1w$2 RewriteRule ^([^X]*)X(.*)$ $1x$2 RewriteRule ^([^Y]*)Y(.*)$ $1y$2 RewriteRule ^([^Z]*)Z(.*)$ $1z$2 # If there are any uppercase letters, restart at very first RewriteRule in file. RewriteRule [A-Z] - [N] RewriteCond %{ENV:HASCAPS} TRUE RewriteRule ^/?(.*) /$1 [R=301,L]

Ответ 2



Решение через PHP: if ( $_SERVER['REQUEST_URI'] != strtolower( $_SERVER['REQUEST_URI']) ) { header('Location: http://'.$_SERVER['HTTP_HOST'] . strtolower($_SERVER['REQUEST_URI']), true, 301); exit(); }

Ответ 3



if ( $_SERVER['REQUEST_URI'] != strtolower( $_SERVER['REQUEST_URI']) ) { header('Location: //'.$_SERVER['HTTP_HOST'] . strtolower($_SERVER['REQUEST_URI']), true, 301); exit(); } Лучше использовать "//" после Location вместо "http://". Это сделает выбор протокола автоматическим и предотвратит от двойной переадресации, если на сервере она настроена с http на https.

суббота, 30 ноября 2019 г.

Многоязычность Интернет страницы/сайта

#apache #htaccess #php


Стало интересно как можно реализовать многоязычность Интернет страницы/сайта, "погуглил"
некоторое время, но на толковое разъяснение что да как не наткнулся... Не могли бы
Вы товарищи ткнуть носом в строну куда надо копать?    


Ответы

Ответ 1



Нужно сделать файл, содержащий объявление констант, в которых будут строки для вывода в разных местах сайта. Например (приводил уже где то)... Главный файл: Файл русского языка: Файл английского языка: Файл шаблона: <?=LANG_TITLE?>

Просто нужно поместить в $language имя файла языка, для удобства без расширения. Следует еще предусмотреть вывод страницы на дефолтном языке, если в $language ничего не присвоено. Вот, такова идея. Если что не ясно, пишите! Удачного дня :)

Ответ 2



Процесс создания мультиязычности обычно делят на две части: интернационализацию и локализацию. Оба этих процесса хорошо описаны в wikipedia. Наиболее популярным и удобным инструментом для интернационализации, как сайтов, так и прикладных программ является gettext. Для PHP так же есть соответствующее расширение. Основная идея этой библиотеки заключается в том, что для обозначения переводимой используется сама оригинальная строка, а не какие-либо специальные идентификаторы. При этом, если перевод данной строки отсутствует, то просто выводится оригинальная строка. Например, тот же шаблон ответа выше будет выглядеть так: <?= _('Main page') ?>

Более подробно про gettext и его возможностях можно прочитать в той-же wikipedia. PS В документации к gettext говорится, что оригинальные строки должны быть на английском, однако, в последних версиях gettext можно использовать и русские строки, при условии повсеместного использования utf-8. В этом случае, возможно, будет некоторая путаница в английской локализации, но это проблема легко решается.

Ответ 3



Хотелось бы дополнить, если использовать базу данных, то в списке страниц сайта, можно добавить вариант текста на нескольких языках пример таблицы : id - идентификатор страницы в базе name - имя на английском как псевдоним t_ru - название на русском t_en - название на английском c_ru - контент на русском c_en - контент на английском и при необходимости грузить только нужную колонку, язык давать на выбор изначально, а сохранять его параметры в cookie, например :
Примерно как то так, способов реализаций очень много, в большинстве случаях можно обойтись и без базы данных и использовать файлы. Весь смысл создания сайта на разных языках - это знать нужный для посетителя язык и выводить вариант страницы на этом языке. А если нужно перевести надписи на кнопках, заголовки и т.д., то можно создать файл с массивами, и подключать его в начале страницы функцией require, именно ей и именно вначале, т.к. она не замедляет работу программы, как это делает include();. пример : '; ?> Сразу извиняюсь за возможные ошибки, т.к. пишу без возможности проверить.

вторник, 16 июля 2019 г.

.htaccess редирект средствами mod_rewrite

На сайте использую ЧПУ. Пример:
RewriteRule ^index$ index.php RewriteRule ^index/$ index.php
В итоге, в адресную строку можно легко вводить такой адрес http://site.ru/index. Но вот незадача. Как теперь сделать так, чтобы ссылка типа http://site.ru/index.php стала недоступной, а доступ ко странице index.php мог бы осуществлять только по адресу http://site.ru/index?


Ответ

Ваши два правила легко можно объединить в одно, взяв слеш в квадратные скобки и написав после них знак вопроса - это сделает его "необязательным" символом, который может быть, а может не быть.
По сути вопроса - например, так:
RewriteRule ^index[/]?$ index.php [L,E=ACCESS_ALLOWED:1] RewriteCond %{REQUEST_URI} ^/index.php$ RewriteCond %{ENV:REDIRECT_ACCESS_ALLOWED} ^$ RewriteRule ^index.php$ - [F]
Что тут происходит: первая строчка дублирует Ваши правила из вопроса, с той разницей, что при перенаправлении с index на index.php устанавливает переменную окружения ACCESS_ALLOWED со значением 1. Имя переменной можно выбрать произвольно - она не имеет значения для Apache, и нужна нам только в этих правилах.
Во второй и тертьей строчке задаются два условия: "запрошен URI index.php" и "значение переменной окружения ACCESS_ALLOWED пусто". В последней строчке запрещается доступ к index.php
Как это работает: при запросе index или index/ происходит перенаправление на index.php с установкой переменной ACCESS_ALLOWED, равной 1. Условие о пустой переменной ACCESS_ALLOWED, соответственно, не срабатывает, и обусловленное этим правило о запрете доступа к index.php не выполняется. При запросе же index.php напрямую переменная ACCESS_ALLOWED оказывается не установленной, условие о её пустоте срабатывает, и обусловленное им правило о запрете доступа к index.php выполняется. В итоге по запросу index попасть на index.php можно, а по "прямому" запросу index.php - нет.
Можно, на самом деле, поступить ещё изящнее: вместо запрета доступа "напрямую" к index.php просто перебрасывать такие запросы HTTP-редиректом на "рекомендуемый" index/, сделать это можно вот так:
RewriteRule ^index[/]?$ index.php [L,E=ACCESS_ALLOWED:1] RewriteCond %{REQUEST_URI} ^/index.php$ RewriteCond %{ENV:REDIRECT_ACCESS_ALLOWED} ^$ RewriteRule ^index.php$ index/ [L,R=301]
Такая схема с 301-м редиректом полезна, когда у вас на сайте изменились адреса страниц, и есть задача "обучить" новым адресам поисковые системы, но не хочется терять трафик, идущий со старых ссылок на старые адреса.