#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
nowsomething
, который должен быть в DocumentRoot вашего apache, чтобы это сработало. Второе правило заключается только в том, чтобы здесь перехватывать ссылки на несуществующие файлы / каталогindex.php
. Кстати, я снова прочитал ваш пост, возможно, вам следует удалить RewriteCond для первого правила, поскольку запрашиваемый вами URL-адрес больше не существует, и он никогда не будет соответствовать.