.htaccess mod-переписать условные операторы и отправить запрос GET?

#.htaccess #mod-rewrite #url-rewriting #friendly-url

#.htaccess .htaccess #мод-переписать #url-переписывание #дружественный URL #.htaccess

Вопрос:

Не обязательно проблема, просто что-то, что я еще недостаточно хорошо знаю, чтобы сделать. У меня есть файл .htaccess, который я использую для перезаписи URL. Это то, что у меня есть сейчас.

 ErrorDocument 404 /inc/error_documents/404.php
ErrorDocument 503 /inc/error_documents/503.php

# For security reasons, Option followsymlinks cannot be overridden.
#Options  FollowSymLinks
Options  SymLinksIfOwnerMatch
RewriteEngine ON

RewriteRule ^home$ /index.php [nc]
RewriteRule ^(about|contact|giving-tree)/?$ /$1.php [nc]

RewriteRule ^giving-tree/([0-9 ]?)/?$ giving-tree.php?ageBegin=$1 [nc]
RewriteRule ^giving-tree/([0-9 ]?)/([0-9 ]?)/?$ giving-tree.php?ageBegin=$1amp;ageEnd=$2 [nc]
RewriteRule ^giving-tree/([0-9 ]?)/([0-9 ]?)/([0-9 ]?)/?$ giving-tree.php?ageBegin=$1amp;ageEnd=$2amp;page=$3 [nc]
  

Что я хочу иметь возможность сделать, так это сделать некоторые части из 3 нижних правил необязательными. Я знаю, что могу сделать это с помощью RewriteCond, но я не уверен, как. Что мне нужно, так это в основном это:

 RewriteCond %{HTTP_HOST} ^hearttohandparadise.org/giving-tree
RewriteRule /beginAge-([0-9 ]) #make it send GET request with beginAge as the variable
RewriteRule /endAge-([0-9 ]) ?beginAge=$1 #make it send GET request with endAge as the variable
  

и т.д. … и т.д…

Есть ли какой-нибудь способ добиться этого, просто полагаясь на .htaccess? или я просто фантазирую?

Простите меня, но это звучит глупо.

Комментарии:

1. ваши условия и правила неверны! что означает слово необязательно ?

Ответ №1:

Нет, это совершенно правильная идея. В принципе, вы хотели бы разрешить пользователю записывать URI неструктурированным образом, без строгого порядка, не так ли? Например, я мог бы написать giving-tree/page-6 / endAge-23?

Если да, то это то, что вы ищете:

 RewriteRule /beginAge-([0-9] ) giving-tree.php?beginAge=$1 [QSA,NC]
RewriteRule /endAge-([0-9] ) giving-tree.php?endAge=$1 [NC,QSA]
RewriteRule /page-([0-9] ) giving-tree.php?page=$1 [NC,QSA]
  

Видите ли, если какая-либо часть URI соответствует выражению «/beginAge-([0-9] )», она будет перенаправлена на giving-tree.php?beginAge=$ 1; волшебство выполняется опцией QSA, Добавление строки запроса, которая, ну, добавляет любую существующую строку запроса к результирующему URI. Так как найдено все больше совпадений и добавлено все больше параметров GET, строка запроса просто растет.

Если вы хотите более строгую вещь, где некоторые параметры являются необязательными, но их порядок фиксирован, тогда это более уродливо по величине:

 RewriteRule /(beginAge-)?([0-9] )/?(endAge-)?([0-9] )?/?(page-)?([0-9] )? giving-tree.php?beginAge=$2amp;endAge=$4amp;page=$6 [NC]
  

Я просто сделал все необязательным, используя ? оператор. Для этого может потребоваться некоторая доработка / реструктуризация.

(В качестве альтернативы, вы могли бы просто сделать это:

  RewriteRule ^giving-tree/([^/] )/?$ process.php?params=$1 [nc]
  

То есть, захватить всю часть URI после части с предоставлением дерева, объединить все это в один параметр, затем обработать это с помощью PHP (поскольку он несколько лучше приспособлен для работы со строками). Но первая версия, безусловно, более элегантна.)

Кстати, вы уверены насчет частей ([0-9 ]?)? Это означает «Один или ни одного символа, который может быть цифрой или знаком плюс». Я думаю, вы имели в виду ([0-9] ), то есть «одну или более цифр».