У меня есть сайт, расположенный по адресу
application
controllers
views
...
public <- the root of the site
index.php <- entry point
css
...
Таким образом, URL-адрес: http://localhost/application/public
. Я хотел бы, когда пользователь вводит только http://localhost/application/public
ничего не делать, кроме вызова index.php, не показывая его.
Вот некоторые примеры:
http://localhost/application/public
→ http://localhost/application/public
или http://localhost/application/public/
НО
http://localhost/application/public/asdf
→ Переписать внутренне по http://localhost/application/public/index.php
и показать только http://localhost/application/public/asdf
Я написал файл.htaccess. Единственная проблема заключается в том, что при вводе http://localhost/application/public
открывается http://localhost/application/public/index.php
вместо http://localhost/application/public
Еще одна вещь - я хочу, чтобы существующие каталоги были переписаны, поэтому только существующие файлы не следует переписывать в index.php. Поэтому в основном http://localhost/application/public/css
следует переписать на index.php. Причина, по которой я хочу это, - опустить ошибку Forbidden 403 и любезно сообщить пользователю, что путь не существует.
HTAccess
Options +FollowSymLinks -MultiViews -Indexes
RewriteEngine On
RewriteBase /application/public/
#Remove trailing slash
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/$ $1 [R=301,L]
#Do the rewriting
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [NC,L]
Причина, по которой я устанавливаю RewriteCond %{REQUEST_FILENAME} !-d
- это запретить переписывание http://localhost/application/public
. Если http://localhost/application/public
переписывается, он загружает http://localhost/application/public/index.php
На самом деле, я знаю, что необходимы некоторые изменения в RewriteCond %{REQUEST_FILENAME} !-d
. Я хочу, чтобы корневая, общая папка не переписывалась, это должно быть единственным исключением. Все остальные физические папки, такие как css, js, должны быть перезаписаны, как и не существующие. Файлы не следует переписывать. Благодарю!
Хорошо, я думаю, что нашел решение.
Options +FollowSymLinks -MultiViews -Indexes
RewriteEngine On
RewriteBase /application/public/
RewriteRule ^(css/?|js/?)$ index.php [NC,L] <- Folders css, js will be rewritten, but root directory won't be rewritten. Files inside them also won't be rewritten.
#Remove trailing slash
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/$ $1 [R=301,L]
#Do the rewriting
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [NC,L]