Как работают правила перезаписи в mod_rewrite

#apache #mod-rewrite

#apache #мод-перезапись

Вопрос:

я внес много изменений в свое веб-приложение, и URL-адреса были такими..

http://miwebapp.com/public/module/action

Но теперь я изменил структуру каталогов, и общая папка теперь является папкой webroot, это означает, что она больше не существует.

теперь мои URL-адреса выглядят

http://miwebapp.com/module/action

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

Ты попробуй это..

 RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 
RewriteRule ^public/(. )$ /$i [NC,L]
RewriteRule ^.*$ /index.php [NC,L]
  

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

Комментарии:

1. удалить public/ часть rewriterule ?

2. Что происходит с вашими текущими правилами? Кроме того, находятся ли эти правила в .htaccess файле или в вашей конфигурации Apache?

3. Они находятся в .htaccess в папке webroot 🙂

4. Привет @oblig если я удаляю public в своем правиле, мой rewriter сообщает контроллеру моего веб-приложения, что public является модулем : (

Ответ №1:

Удалите первый RewriteRule. Все существующие файлы (размер не равен нулю ссылка) и URL всех каталогов перехватываются вашим условием перезаписи, и вы устанавливаете его так, чтобы оно ничего не делало и было последним правилом ([L]). Итак, все проходит через это единственное правило.

Кстати: я не уверен, существует ли $ i, но вместо этого мы используем для получения $ 1.

Правка 1:

Да, я тоже это видел! Но я нашел решение:

 RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d      
RewriteRule ^public/(. )$ /$1 [NC,L]     

RewriteCond %{REQUEST_FILENAME} !-s     
RewriteCond %{REQUEST_FILENAME} !-l     
RewriteCond %{REQUEST_FILENAME} !-d     
RewriteRule ^.*$ /index.php [NC,L]      
  

это должно избежать перезаписи всего файла в index.php в циклах! (Обратите внимание, что при выполнении перенаправления .htaccess обрабатывается повторно с новыми значениями, [L] просто остановите перезапись для текущего запроса)

Комментарии:

1. Привет, @ M’vy я заменил de $ i на $ 1 и отбросил первое правило, и я получил ошибку 500, и в журнале моего сервера появилось это.. RewriteRule ^public/(. )$ /$1 [NC,L] RewriteRule ^.*$ /index.php [NC,L]

2. mod_rewrite: достигнуто максимальное количество внутренних перенаправлений. Предполагаю ошибку конфигурации. Используйте ‘RewriteOptions MaxRedirects’, чтобы увеличить ограничение, если это необходимо.

3. Привет, @M’vy спасибо за вашу помощь, я полагаю, что первое правило перезаписи автоматически удалит общедоступное слово и отправит новый URL без общедоступного, затем второе правило перезаписи перехватит новый чистый URL и перенаправит на index.php я прав? поскольку does’nt работает, и общедоступный остается в URL, а полученный общедоступный модуль не существует :(, есть какие-нибудь подсказки?

4. Первое правило должно переписать любой URL, подобный /public/something to /something now something , который должен быть в DocumentRoot вашего apache, чтобы это сработало. Второе правило заключается только в том, чтобы здесь перехватывать ссылки на несуществующие файлы / каталог index.php . Кстати, я снова прочитал ваш пост, возможно, вам следует удалить RewriteCond для первого правила, поскольку запрашиваемый вами URL-адрес больше не существует, и он никогда не будет соответствовать.