Вопрос по apache, .htaccess – значение RewriteBase доступно как переменная / ссылка?

4

Я пишу файл .htaccess, который проверит, существует ли запрошенная страница в кеше или нет. Чтобы выполнить проверку (и сохранить типизацию), я устанавливаю переменную ENV с расположением кэша:

# all this works as I expect #
<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /some/path/
RewriteRule ^(.*)$ - [E=rewritebase:/some/path/,E=cache:%{ENV:rewritebase}cache/] 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{ENV:cache}$1\.html -f
RewriteRule ^(.*)$ $1\.html [L]

</IfModule>

Как вы можете видеть, мне также необходимо установить переменную ENV в значение «стоять на месте»; для значения RewriteBase. Я бы предпочел этого не делать, поскольку, если RewriteBase изменен, я должен также помнить об изменении переменной ENV. В конце концов, это может быть частью CMS, используемой другими, которую я хочу сделать максимально простой / понятной для настройки, с наименьшим количеством возможностей для ошибок. Я хотел бы иметь возможность установить толькоENV:cache переменнаяwithout необходимость установкиENV:rewritebase переменная, вот так (или похожая):

# doesn't work #
RewriteRule ^(.*)$ - [E=cache:%{RewriteBase}cache/]

Как подразумевается,cache/ каталог всегда будет находиться внутри каталога, указанного в RewriteBase. [редактировать]
, , , однако, это будетnot всегда быть физическим путем, где существует этот файл .htaccess.
[/редактировать]

Я также был бы рад услышать альтернативные предложения. Спасибо всем!

Ваш Ответ

2   ответа
1

Я нашел решение использовать значение перезаписи базы. Это только одна точка. , Это работает. Он пересылает rewritebase, если определено rewritebase. Если rewritebase не определено, оно пересылается в каталог кода.

RewriteRule ^index.html(/?)$ ./ [R=301,L]
Это может работать для вас, но оно не использует значение базы перезаписи. Точка перед косой чертой означает «текущий каталог». Это важно отметить. В зависимости от RewriteRule это может ухудшить ситуацию.
4

Используйте переменную окружения дляпользователь, который запускает Apache,

#.profile of Apache user
rewritebase = "some/path"

затем обратитесь к нему в вашем файле .htaccess:

#.htaccess file
RewriteBase {$rewritebase}    
RewriteRule ^(.*)$ - [E=cache:%{ENV:rewritebase}cache]

Псевдо ReWriteRule также может сделать трюк:

#This will be true for any user agent
RewriteCond  %{HTTP_USER_AGENT}  ^.*

#Replace / with / and set the rewritebase variable to /some/path
RewriteRule  /(\/some\/path)* / [E=rewritebase:$1/some/path]

#Reference the rewritebase variable
RewriteBase {$rewritebase}

#Redefine the rewritebase variable
RewriteRule ^(.*)$ - [E=rewritebase:$1]
Я обнаружил такую возможность некоторое время назад, и это решило бы мою проблему - но, к сожалению, это для проекта, который будет распространяться, и я не могу быть уверен, что у всех пользователей будет доступ к настройке Apache. На самом деле, я уверен, что большинство из них не выиграют (виртуальный хостинг). Спасибо, в любом случае! Я ценю его! traq
Этот фальшивый Rewrite (я только что заметил ваше редактирование в августе)trick, Я понятия не имел, что ты мог сделать что-то подобное. Спасибо, что вернулись к этому! traq
Да, я работал над чем-то, где это снова возникло и решил обновить пост. Очень полезно на самом деле.

Похожие вопросы