.htaccess мод-переписать условные операторы и отправить запрос GET? - PullRequest
2 голосов
/ 17 октября 2011

Не обязательно проблема, просто то, что я еще недостаточно осведомлен, чтобы сделать. У меня есть файл .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=$1&ageEnd=$2 [nc]
RewriteRule ^giving-tree/([0-9+]?)/([0-9+]?)/([0-9+]?)/?$ giving-tree.php?ageBegin=$1&ageEnd=$2&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 голос
/ 17 октября 2011

Нет, это совершенно правильная идея.Вы бы в основном хотели позволить пользователю писать URI неструктурированным образом, без строгого порядка, верно?Например, я мог бы написать дающее дерево / 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] +)", оно будет перенаправлено наiving-tree.php? beginAge = $ 1;Волшебство делается с помощью параметра QSA Query String Append, который, ну, в общем, добавляет любую существующую строку запроса к результирующему URI.Таким образом, поскольку все больше и больше совпадений найдено и добавлено все больше GET-параметров, строка запроса просто увеличивается.

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

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

Я просто сделал все необязательным, используя?оператор.Этот может использовать некоторые предварительные / реструктурирующие.

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

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

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

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

...