Я создал свою небольшую CMS на PHP, поэтому в моем .htaccess
я использую перенаправление на index.php
, как это
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Теперь с чистым JavaScript мне нужно проверить, существует ли на моем сервере какой-либо HTML-файл, поэтому я попытался использовать
var http = new XMLHttpRequest();
http.open('HEAD', 'http://path/to/myfile.html', false);
http.send();
console.info(http.status);
но я всегда получаю статус 200 независимо от того, существует файл или нет
Как я вижу, причина в перенаправлении на index.php
в моем .htaccess
Итак, как я могу получить правильный статус существующего файла?
Никакой JS по-прежнему не проверяет файлы на сервере. XMLHttpRequest
просто отправляет запрос AJAX на сервер, и есть некоторый серверный код, который проверяет его и возвращает ответ обратно JS.
Мне достаточно проверить if (http.status == 200)
или 404
Поскольку ваш код JS использует метод HEAD
, вы можете пропустить правило .htaccess для запросов HEAD
.
Не могли бы вы объяснить здесь немного подробнее, потому что моя первая мысль заключается в том, что проверка наличия какого-либо файла в серверной части не входит в обязанности внешнего интерфейса. Особенно с динамическим сервером, который обрабатывает все запросы.
Поскольку ваш код Javascript использует метод HEAD
, вы можете пропустить правило .htaccess для всех запросов HEAD
:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_METHOD} !HEAD
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{REQUEST_METHOD} !HEAD
пропустит ваше правило переднего контроллера, если метод запроса - HEAD
.
С
XMLHttpRequest
он ДЕЙСТВИТЕЛЬНО может, я получаю правильныйhttp.status
, если отключу перенаправление в моем.htaccess
.