перезапись URL с .json на .php - PullRequest
       20

перезапись URL с .json на .php

2 голосов
/ 01 ноября 2011

Я хочу http://server/path/app.json?a=foo&b=bar для сопоставления с http://server/path/foo.php?a=foo&b=bar, используя mod_rewrite.У меня есть следующее заклинание в моем .htaccess, которое не дает никакой радости

RewriteEngine On
RewriteRule ^([^.?]+).json(.*)$ $1.php$2 [L]

Предложения?

Обновление: добавление rewrite.log и error.log вывода (комментарии не позволяютформатирование)

Я получаю следующее в rewrite.log

strip per-dir prefix: /Users/user/Sites/dir/app.json -> app.json
applying pattern '^([^.?]+).json(.*)$' to uri 'app.json'
rewrite 'app.json' -> 'app.php'
add per-dir prefix: app.php -> /Users/user/Sites/dir/app.php
internal redirect with /Users/user/Sites/dir/app.php [INTERNAL REDIRECT]

, а в журнале сервера apache написано

The requested URL /Users/user/Sites/dir/app.php was not found on this server.

1 Ответ

2 голосов
/ 01 ноября 2011

Если я правильно прочитал ваш вопрос, вы хотите:

http://server/path/app.json?a=foo&b=bar

Собирается:

http://server/path/foo.php?a=foo&b=bar

Когда вы захватываете (app).json $1 - это app, а $2 - это ваша вторая скобка, это ... ничего (часть между json и ?). Поскольку все после знака вопроса является QUERY STRING и не может быть захвачено здесь. Ваш rewriteRule работает с запрошенным файлом, а не с QUERY STRING . Таким образом, вы нигде не захватили foo. Для QUERY_STRING вы можете использовать флаг [QSA] в rewriteRule, который просто добавит a=foo&b=bar после перезаписи.

RewriteEngine On
RewriteRule ^([^.?]+).json(.*)$ $1.php$2 [L]

Здесь вы указываете apache повторно использовать $1 (имя файла без .json), поэтому app.json будет перенаправлено на app.php, а не foo.php.

RewriteEngine On
RewriteRule ^([^.?]+).json(.*)$ $1.php [L,QSA]

Перенаправит app.json?a=b&z=r на app.php?a=b&z=r.

Теперь, если вам действительно нужно записать foo в качестве первого параметра QUERY_STRING, правило станет более жестким. Но вы могли бы сделать это так (здесь вместо первого параметра я определяю параметр 'a =' и фиксирую его значение в % 4 ):

RewriteCond %{QUERY_STRING} (.*)(^|&|%26|%20)a(=|%3D)([^&]+)(.*)$
RewriteRule ^([^.?]+).json$ %4.php? [L,QSA]
...