2016-02-17 1 views
1

Возможно, лучший вопрос: есть ли способ использовать переменные сервера в соответствующей строке?htaccess RewriteCond: Почему переменная сервера не соответствует самому себе?

К примеру, я не могу понять, почему это не совпадает:

RewriteCond %{REQUEST_URI} %{REQUEST_URI} 

Во-первых, две точки.

  1. Я знаю это состояние серверов без цели, как есть.
  2. Я знаю, что у меня плохое знание как htaccess, так и regex.

То, что я хочу, чтобы обобщенно превратить этот URL www.example.com/dir/path/info в www.example.com/dir?foo=/path/info для самонастройки.

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

RewriteEngine On 
Options -Multiviews -Indexes +FollowSymLinks 
RewriteBase/
DirectorySlash Off 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} (.+)%{PATH_INFO} 
RewriteRule ^(.+?) index.php?dir=%1&path=%2 [L] 

Не повезло. Чтобы устранить я свел его к этому:

RewriteCond %{PATH_INFO} (.+) 
RewriteRule ^(.+?) index.php?dir=%1 [L] 

Как и ожидалось, запрос возвращал Foo = «/ путь/данные»

Так что я попытался это, который я думал, что будет соответствовать ни на что: RewriteCond% {PATH_INFO }% {} PATH_INFO

Это не удалось, так как последняя попытка, я попытался захватить строку:

RewriteCond %{PATH_INFO} (.+) 
RewriteCond %{PATH_INFO} %1 

Это также не удалось найти матч, который имеет меня озадачило. % 1 должна быть полной строкой% {PATH_INFO}. Как он мог не соответствовать себе ???

Я не думаю, что это имеет значение, но я использую XAMPP для Windows7 в FastCGI.

ответ

3

Rewrite модель PARAMS только позволяют регулярное выражение (Тхо CondPattern также имеет специальные флаги для испытаний и сравнений):

RewriteCond СравниваемаяСтрока CondPattern
RewriteRule Pattern Замена

сервера такие переменные, как% {REQUEST_URI}, могут использоваться только в Teststring и Substitution. Следующие документы очертить это использование:

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewritecond http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule

Если это будет идти в вашем главном.Htaccess, возможно, попробовать:

RewriteCond %{REQUEST_URI} !index\.php$ 
RewriteRule ^([^/]+)/(.+)$ index.php?dir=/$1&path=/$2 [L] 

Еще два примера:

Sample1

RewriteBase/
RewriteRule ^(.+/)?index.php(/.+) index.php?dir=/$1&path=$2 [R,L] 

Sample2

RewriteBase/
RewriteRule ^((.+/)?index.php)(/.+) $1?path=$3 [R,L] 

sample3

RewriteBase/
RewriteRule ^(.+/)?(.+\.php)(/.+) $1$2?foo=$3 [R,L] 

все они делают внешнюю перезапись, чтобы вы могли видеть результат в адресе браузера. Чтобы вернуться к внутренней перезаписи, просто снимите флаг [R]

+0

спасибо. Это всеобъемлющий ответ, почему они не совпадают. Но я все еще удивлен тем, что не смог захватить строку с RewriteCond% {PATH_INFO} (. +), А затем передать строку с обратной ссылкой% 1. Таким образом, кажется, что нет абсолютно никакого способа, чтобы htaccess мог найти самый глубокий существующий каталог автоматически. Я считаю, что это так странно, потому что% {REQUEST_FILENAME} делает именно это. К счастью, у меня недостаточно волос, чтобы вырваться. –

+1

@GregorMacgregor Предполагаемое использование PATH_INFO должно соответствовать всем значениям после имени сценария и перед запросом. Однако, я не вижу способ извлечь директорию сценария (если это то, что вы пытаетесь сделать?), Разобрав PATH_INFO. Тем не менее, нет четкой картины конечной цели, но я добавил еще два примера, чтобы ответить выше. –

+0

Очевидно, я шел к нему назад. То, что я хотел, было способом разбить запрос пополам по имени сценария. Представьте себе это. www.example.com/dir/file.php/some/option. Это плохой URL-адрес, который возвращает 404. Я хотел поймать файл и переписать URL-адрес на www.example.com/dir/file.php?foo=/some/option. Таким образом, я мог бы использовать обычный бутстрап для моего основного index.php, но также добавлять специальные файлы и папки без изменения htaccess для каждой ситуации. –

2

Хорошо, я нашел способ достижения этой цели.

В основном я пытался сравнить две переменные сервера. htaccess этого не сделает. Я хотел извлечь часть «симпатичного» URL-адреса, который указывает на фактический файл или папку. Переменная $ {SCRIPT_URL} должна делать это, но она либо обесценивается, либо ненадежна. Работа заключается в том, чтобы поместить обе переменные в тестовую строку и использовать обратную ссылку regex, чтобы найти точку дублирования.

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteCond %{REQUEST_URI}%{PATH_INFO} (.*?)(/.+)\2$ 
RewriteRule ^(.*)$ %1.php?strappath=%2 [QSA,END] 

В приведенном выше примере 1% будет URI файла и% 2 будет оставшийся путь после URI, дублируя% {PATH_INFO}.

Следуйте это правило, когда нет какой-либо дополнительной Информации о пути

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+?)$ $1.php [QSA,END] 

Если файл .php не найден, я хочу индекс этого каталога и добавить имя файла не-найдено в Pathinfo. Это немного сложнее.

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php !-f 
RewriteCond %{REQUEST_FILENAME} ^(.*)(/.+)$ 
RewriteCond %1 -d 
RewriteCond %1/index.php -f 
RewriteCond %{REQUEST_URI}%{PATH_INFO} ^(.*?)(/.+)\2$ [OR] 
RewriteCond %{REQUEST_URI} ^(/.+)(/.+)?$ 
RewriteCond %1 ^(.*)(/.+)$ 
RewriteRule ^(.*)$ %1/index.php?strappath=%2%{PATH_INFO} [QSA,END] 

выше раздел не удается поймать URLs, которые указывают непосредственно в существующую папку с index.php, так, чтобы поймать тех, кто:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_FILENAME}/index.php -f 
RewriteCond ^(.+)$ $1/index.php [QSA,END] 

Я сомневаюсь, что кто-либо считает, что это полезно, но я имею замеченные вариации этого вопроса задавались снова и снова без какого-либо рабочего решения.

Смежные вопросы