Я читал статьи уже пару часов, но поскольку нет вывода на консоль для отладки файлов htaccess, я полностью разочарован.
Уродливая структура папок:
/html/api/v2/estimates/index.php?status=completed
/html/api/v2/estimate/index.php?id=1001
/html/api/v2/proposals/index.php?status=accepted
/html/api/v2/proposal/index.php?id=1001
/html/api/v2/contracts/index.php?status=signed
/html/api/v2/contract/index.php?id=1001
/html/api/v2/invoices/index.php?status=sent
/html/api/v2/invoice/index.php?id=1001
Желаемая структура папок:
/html/api/v2/estimates/completed
/html/api/v2/estimate/1001
/html/api/v2/proposals/accepted
/html/api/v2/proposal/1001
/html/api/v2/contracts/signed
/html/api/v2/contract/1001
/html/api/v2/invoices/sent
/html/api/v2/invoice/1001
Мой числовой .htaccess работает, только если Я помещаю их в каталоги смета, предложение, договор и счет-фактура.
Пример:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(\d+)/?$ index.php?id=$1
</IfModule>
Моя строка .htaccess работает, только если Я помещаю их в каталоги сметы, предложения, контракты и счета-фактуры.
Пример:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(\w+)/?$ index.php?status=$1
</IfModule>
Что мне нужно изменить в этих сценариях выше, если я должен поместите файл htaccess в /v2
папка?
Попробуйте следующее в /v2/.htaccess
файл вместо этого:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(\w+)/(\d+)/?$ $1/index.php?id=$2 [L]
RewriteRule ^(\w+)/(\w+)/?$ $1/index.php?status=$2 [L]
"Числовое" правило должно быть перед правило "строки", чтобы избежать конфликта. В противном случае «строковое» правило выиграть каждый раз с текущим регулярным выражением.
Первый (\w+)
подшаблон в каждом правиле захватывает подкаталог (estimate
, estimates
, и т.д.). Кажется, вам не нужно явно проверять подкаталог по имени, если нет потенциального конфликта. например. /estimates/1234
естественно будет поймано первым правилом, а не вторым, что, вероятно, было бы намерением - но это зависит от того, /estimates/1234
является действительным URL-адресом или нет. (Возможно, эту проблему можно решить, просто проверив конечный s
на имя каталога?)
Обратите внимание, что \w
Спички a-z
, A-Z
, 0-9
и _
(нижнее подчеркивание). Если подкаталог и / или «строка» состоят только из букв (или даже только из строчных букв), тогда шаблон следует сделать более строгим. Если бы это было так, то порядок правил не имел бы значения, так как это устранило бы конфликт.
Кажется, вам не нужна (относительно дорогая) проверка (и) файловой системы, поскольку «ограничивающее» регулярное выражение не должно соответствовать реальному файлу (если у вас нет файлов в файловой системе без расширений файлов? Очень маловероятно, что я бы стал считать.).
В <IfModule>
wrapper не требуется, так как эти правила являются обязательными для работы вашего сайта.
ОБНОВИТЬ: Обратите внимание, что я также удалил каталог чек. Если у вас есть дополнительные подкаталоги формы /estimates/<subdir>
и т.д., то эти директивы могут потенциально совпадать, делая каталог недоступным (он перенаправляется на ваш скрипт, который, как я ожидал, вызовет 404). Однако обычно вы все равно не хотите предоставлять пользователю прямой доступ к самим каталогам - обычно они возвращают 403. Файлы в этих каталогах по-прежнему будут доступны, поэтому я не думаю, что это будет проблемой.