#.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] ), то есть «одну или более цифр».