- Настройка виртуальных хостов на локальном сервере
- Php – How to enable the Virtual Directory Support php
- Best Solution
- Related Solutions
- Correctly setting up the connection
- Explanation
- Can prepared statements be used for dynamic queries?
- PHP 8.0 and higher
- How to enable the Virtual Directory Support php?
- Solution 2
- PHP. и поддержка виртуальных директорий
- #2 KPbIC
- #3 MaLaH
- #4 KPbIC
- #5 MaLaH
- #6 KPbIC
- #7 MaLaH
Настройка виртуальных хостов на локальном сервере
Здравствуйте уважаемые сообщники. Вопрос по настройке виртуальных хостов на локальном сервере. История будет не маленькой, по этому прошу под кат.
Дано.
Есть локальная машина МакБук с установленным на нее Веб-сервером MAMP. На этой же машине с эим же веб-сервером уже давно живут и прекрасно себя чувствуют штук 8 локальных сайтов (в основном все на вордпрессе). Все сайты на локальном сервере открываются по переходу типа: localhost:8888/site-name/ (насколько я понимаю локальный сервер Апач использует порт 8888).
Появилась необходимость установить на локальном сервере еще один сайт, но с ним есть определенные нюансы. Этот сайт совершенно самописный и достаточно сложный. Устанавливается и работает он исключительно путем установки виртуального хоста. Т.е. на машине на которой он уже установлен в браузере сайт доступен по адресу: http://business-catalog.net.www
Локальная машина на которой сайт уже работает и с которой его надо перенести на мой МакБук работает под операционной системой WinXP, с установленным и настроенным веб-сервером XAMPP.
Что я уже сделал на своем МакБуке:
В файле httpd.conf раскоментировал строчку: Include /Applications/MAMP/conf/apache/extra/htt pd-vhosts.conf
В файле httpd-vhosts.conf добавил в конце текст вида:
В файле etc/hosts добавил строчку вида: 127.0.0.1 business-catalog.net.www
В результате, ничего не помогает. С запущенным или остановленным веб-севрером MAMP, по адресу http://business-catalog.net.www лицезрею душераздирающую надпись: «It Works!»
ВопросЧто я делаю не так Как таки настроить виртуальный хост? Правильно ли я указал в httpd-vhosts.conf порт 8888 или нужно было оставить как было по умолчанию 80? Туда ли вообще нужно было вставлять этот текст или в httpd.conf?
Очень смущает информация которую выдает php.info:
Почему Virtual Directory Support стоит Disabled, как (и нужно ли?) его поменять на Enabled (на компе с Win Xp где сайт локально успешно работает эта функция в php.info отображается как Enabled)?
Если кому-то покажется, что моя история не совсем в духе сообщества, прошу сильно не ругать, а подсказать где, возможно, обитают более профильные специалисты.
Заранее спасибо вам за помощь дорогие сообщники.
Php – How to enable the Virtual Directory Support php
I see «Virtual Directory Support» is disabled in phpinfo.php, how can I enable it ?
Best Solution
In short: You can’t easily. And you should not.
Longer story: PHP is supposed to provide a shared nothing environment. In this context this means if two scripts are running in parallel they should not interfere. In most cases this is no issue as different scripts use different processes. (Apache module with mod_prefork, FastCGI, fpm etc.)
But in some scenarios people use PHP as a module in a threaded environment. (Microsoft IIS module, Apache mod_mpm module etc.) If that is the case PHP can’t rely on the operating system to separate context but has to do it itself.
One relevant area is the current working directory. The option you mentioned is about that and the name is misleading: it is not «Virtual Directory Support» but «Virtual Current Working Directory Support». It is an abstraction for file system operations.
So when having two PHP requests in different threads and code like include «./foo.php»; , you want that to be relative to the request’s main script and not the global state of the environment. VCWD support does that. As it is only relevant for threaded environments enabling/disabling is bound to the setting whether PHP is built thread safe or not, which is done at compile time. Unless you need to, this is off.
As a user you shouldn’t care about it — it is not related to the ability to use streams or something from your PHP script.
Related Solutions
Php – How to prevent SQL injection in PHP
The correct way to avoid SQL injection attacks, no matter which database you use, is to separate the data from SQL, so that data stays data and will never be interpreted as commands by the SQL parser. It is possible to create SQL statement with correctly formatted data parts, but if you don’t fully understand the details, you should always use prepared statements and parameterized queries. These are SQL statements that are sent to and parsed by the database server separately from any parameters. This way it is impossible for an attacker to inject malicious SQL.
You basically have two options to achieve this:
- Using PDO (for any supported database driver):
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute([ 'name' => $name ]); foreach ($stmt as $row) < // Do something with $row >
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string' $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) < // Do something with $row >
If you’re connecting to a database other than MySQL, there is a driver-specific second option that you can refer to (for example, pg_prepare() and pg_execute() for PostgreSQL). PDO is the universal option.
Correctly setting up the connection
Note that when using PDO to access a MySQL database real prepared statements are not used by default. To fix this you have to disable the emulation of prepared statements. An example of creating a connection using PDO is:
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'password'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
In the above example the error mode isn’t strictly necessary, but it is advised to add it. This way the script will not stop with a Fatal Error when something goes wrong. And it gives the developer the chance to catch any error(s) which are throw n as PDOException s.
What is mandatory, however, is the first setAttribute() line, which tells PDO to disable emulated prepared statements and use real prepared statements. This makes sure the statement and the values aren’t parsed by PHP before sending it to the MySQL server (giving a possible attacker no chance to inject malicious SQL).
Although you can set the charset in the options of the constructor, it’s important to note that ‘older’ versions of PHP (before 5.3.6) silently ignored the charset parameter in the DSN.
Explanation
The SQL statement you pass to prepare is parsed and compiled by the database server. By specifying parameters (either a ? or a named parameter like :name in the example above) you tell the database engine where you want to filter on. Then when you call execute , the prepared statement is combined with the parameter values you specify.
The important thing here is that the parameter values are combined with the compiled statement, not an SQL string. SQL injection works by tricking the script into including malicious strings when it creates SQL to send to the database. So by sending the actual SQL separately from the parameters, you limit the risk of ending up with something you didn’t intend.
Any parameters you send when using a prepared statement will just be treated as strings (although the database engine may do some optimization so parameters may end up as numbers too, of course). In the example above, if the $name variable contains ‘Sarah’; DELETE FROM employees the result would simply be a search for the string «‘Sarah’; DELETE FROM employees» , and you will not end up with an empty table.
Another benefit of using prepared statements is that if you execute the same statement many times in the same session it will only be parsed and compiled once, giving you some speed gains.
Oh, and since you asked about how to do it for an insert, here’s an example (using PDO):
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)'); $preparedStatement->execute([ 'column' => $unsafeValue ]);
Can prepared statements be used for dynamic queries?
While you can still use prepared statements for the query parameters, the structure of the dynamic query itself cannot be parametrized and certain query features cannot be parametrized.
For these specific scenarios, the best thing to do is use a whitelist filter that restricts the possible values.
// Value whitelist // $dir can only be 'DESC', otherwise it will be 'ASC' if (empty($dir) || $dir !== 'DESC')
Php – startsWith() and endsWith() functions in PHP
PHP 8.0 and higher
Since PHP 8.0 you can use the
How to enable the Virtual Directory Support php?
Longer story: PHP is supposed to provide a shared nothing environment. In this context this means if two scripts are running in parallel they should not interfere. In most cases this is no issue as different scripts use different processes. (Apache module with mod_prefork, FastCGI, fpm etc.)
But in some scenarios people use PHP as a module in a threaded environment. (Microsoft IIS module, Apache mod_mpm module etc.) If that is the case PHP can’t rely on the operating system to separate context but has to do it itself.
One relevant area is the current working directory. The option you mentioned is about that and the name is misleading: it is not «Virtual Directory Support» but «Virtual Current Working Directory Support». It is an abstraction for file system operations.
So when having two PHP requests in different threads and code like include «./foo.php»; , you want that to be relative to the request’s main script and not the global state of the environment. VCWD support does that. As it is only relevant for threaded environments enabling/disabling is bound to the setting whether PHP is built thread safe or not, which is done at compile time. Unless you need to, this is off.
As a user you shouldn’t care about it — it is not related to the ability to use streams or something from your PHP script.
Solution 2
Compiling with —enable-maintainer-zts should do it.
But make sure you know what it does, here is an explanation.
PHP. и поддержка виртуальных директорий
В общем скомпилил php на фрюхе и как оказалось без поддержки виртуальных директорий.
Вопрос:
Возможно ли разрешить их без новой компиляции? в конфиге пхп.ини ничего не нашел.
#2 KPbIC
Отправлено 10 Декабрь 2008 — 12:18
без чего, простите?
если вы о реврайт модуле, то это модуль апача, а не пхп.
Сообщение отредактировал KPbIC: 10 Декабрь 2008 — 12:22
#3 MaLaH
Отправлено 10 Декабрь 2008 — 13:14
KPbIC
Virtual Directory Support
#4 KPbIC
Отправлено 10 Декабрь 2008 — 13:25
рассскажите, где вы видите такой модуль у пхп
#5 MaLaH
Отправлено 10 Декабрь 2008 — 13:32
KPbIC
там я не вижу, но в инфе о пхп:
Server API — Apache 2.0 Handler
Virtual Directory Support — disabled
Configuration File (php.ini) Path — /usr/local/etc
Loaded Configuration File — /usr/local/etc/php.ini
Scan this dir for additional .ini files — /usr/local/etc/php
additional .ini files parsed — /usr/local/etc/php/extensions.ini
#6 KPbIC
Отправлено 10 Декабрь 2008 — 13:35
Virtual Directory Support — это относится к IIS`у, а не к php.
php лишь выводит статус поддержки виртуальных директорий вебсервером.
Сообщение отредактировал KPbIC: 10 Декабрь 2008 — 13:37
#7 MaLaH
Отправлено 10 Декабрь 2008 — 13:43
Virtual Directory Support — это относится к IIS`у, а не к php.
php лишь выводит статус поддержки виртуальных директорий вебсервером.
так, тогда у меня такого рода вопрос:
У меня есть сайт на пхп, но при своей работе он как бы создает виртуальные директории, т.е.
http://мой-сайт/contacts, где contacts не является директорией на веб сервере.
я не совсем понимаю, что мне надо отконфигурировать, что бы он заработал.
Сообщение отредактировал MaLaH: 10 Декабрь 2008 — 13:44