Как использовать только mod_rewrite для доступа к файлам PHP и отключить естественный способ обращения к файлу PHP? - PullRequest
1 голос
/ 22 ноября 2011

Я очень новичок в этих вопросах, пожалуйста, помогите.

У меня есть два вопроса относительно mod_rewrite (apache 2.2).

1) Я хочу, например, переписать / войти в login.php. Это может быть сделано с помощью

RewriteRule ^/?login/?$ /login.php [L]

Однако я тоже хотел отключить пользователям доступ к /login.php напрямую.

Если я просто напишу,

RewriteRule ^/?.*\.php$ /file_not_exist.html [L]

Это не работает, и даже / login будет переписан в /file_not_exist.html.

Есть ли способ сделать это? Я заметил, что в документах Apache 2.5 есть флаг [END], но я пока не могу использовать его в Apache 2.2.

2) Я хочу заменить все запросы ajax на / ajax / action, будет сделано следующее,

RewriteRule ^/?ajax/([a-zA-Z]+)/?$ /ajax/$1.php [L]

Однако, когда я пытаюсь получить доступ к / ajax / xyz, где xyz.php не существует, браузер покажет, что "/ajax/xyz.php" не существует, что даст ppl знать, что / ajax / действие реализовано с помощью /ajax/action.php.

Как отключить такое /ajax/xyz.php сообщение не существует? Единственный способ, о котором я могу думать сейчас, - это перечислить все файлы в направлении ajax и выполнить следующее:

RewriteRule ^ /? Ajax / (action1 | action2 | action3) /? $ /Ajax/$1.php [L]

Затем, когда пользователь получит доступ к / ajax / xyz, он просто скажет, что / ajax / xyz не существует, но не /ajax/xyz.php. Но это очень хлопотно. Есть ли лучший способ сделать это?

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 22 ноября 2011

Вот что я делаю для своего сайта: (1) правильно определите 404 в вашем vhost, (и это ответ на ваш второй вопрос: напишите свой собственный файл 404, в котором вы показываете только то, что вы хотите. Например, проверьте IP-адрес и если он локальный (= среда разработки), то показать много информации)

ErrorDocument 404 /404.php

(2) Запретить любой прямой доступ к файлам php:

RewriteRule (.*)php$ - [L,R=404]

Скажите, если это работает

1 голос
/ 22 ноября 2011

1) Если вы хотите ограничить запросы для /login.php, вам нужно использовать RewriteCond для проверки фактического запроса. В противном случае вы собираетесь зацикливаться.

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /login.php
RewriteRule ^ /file_not_exist.html [L]

Вы также можете перенаправить их на /login, если хотите, и пусть первое правило позаботится об этом:

RewriteRule ^ /login/ [L,R=301]

2) Вы можете проверить, существует ли реальный файл, прежде чем переписывать php, снова используя RewriteCond и проверяя, используя "-f"

RewriteCond %{REQUEST_URI} ^/ajax/(.+)/?
RewriteCond %{DOCUMENT_ROOT}/ajax/%1.php !-f
RewriteRule ^ /ajax/no_action.php [L]

Итак, сначала мы проверяем, чтобы запрос начинался с "/ ajax /", и выбираем следующую часть "(. +)". В следующем RewriteCond мы используем обратную ссылку% 1 для доступа к предыдущему совпадению. Таким образом, если запрос был для "/ ajax / blahblah /", следующий RewriteCond проверил бы для "/doc_root/ajax/blahblah.php". ! -F означает «если файл не существует». Таким образом, в этом примере, если «/doc_root/ajax/blahblah.php» не существует, мы переписываем запрос в «/ajax/no_action.php». Вам придется заменить это чем-то, что вы хотите обработать все «плохие» запросы. Может быть, указать на пустой сценарий, который просто ничего не делает, чтобы никто не знал мудрее. Затем вы можете переписать, чтобы изменить /ajax/(.+)/ на /ajax/$1.php:

RewriteRule ^ajax/([A-Za-z]+)/?$ /ajax/$1.php [L]
1 голос
/ 22 ноября 2011
 RewriteRule ^/?.*\.php$ /file_not_exist.html [L]

Это будет работать.Но не тогда, когда вы делаете это вторым RewriteRule.Порядок важен.См. Также Ошибка сервера: все, что вы когда-либо хотели знать о правилах Mod_Rewrite, но боялись спросить?

В частности, вы могли бы %{REQUEST_URI} напрямую проверить наличие -f и затемсоответствует шаблону .*\.php($|/).


Я не совсем понял ваш второй вопрос.Но, похоже, вам следует использовать PATH_INFO там:

 RewriteRule ^/?ajax/([a-zA-Z]+)/?$ /ajax.php/$1 [L]

Поскольку перезапись на несуществующий $1.php, очевидно, должна привести к ошибке.

(Если это реальный каталог с реальнымсценариев, а затем просто используйте тест RewriteCond с -f.)

...