.htaccess перезаписывает переменные PATH_INFO в пустые перед передачей в шаблон; не удалять index.php из URL

Всем доброе утро, надеюсь это будет легко! (Я еще даже не пил кофе, почему я так рано встаю?!)

В любом случае... у меня есть для вас два вопроса: Первая (основная) проблема, что я пытаюсь удалить index.php из своих ссылок (что кажется почти невозможным, спасибо hostgator :)). После множества поисков я дошел до того, что /page перенаправляет на /index.php/page. Сейчас это лучше, чем ничего, но конечно все же не идеально. И мне пришлось использовать [R], чтобы сделать это. Мой .htaccess:

RewriteCond   %{REQUEST_FILENAME}   !-f 
RewriteCond   %{REQUEST_FILENAME}   !-d 
RewriteRule   ^(.*)$                index.php/$1  [R,L]

Вторая (сложная) проблема. Мне нужно удалить index.php из URL-адреса, но при этом убедиться, что отображается правильный контроллер страницы (т. е. какая страница находится в URL-адресе). Я использую PATH_INFO, чтобы получить переменную и отобразить нужную страницу, и это работает, когда есть index.php.

Но по какой-то причине, когда вы убираете R из этого последнего правила RewriteRule, /page всегда по умолчанию использует основной шаблон index.php. Это похоже на то, как .htaccess или что-то еще переписывает PATH_INFO на пустое, прежде чем мой сайт сможет обработать страницу. Я думаю, мне нужно заблокировать PATH_INFO прежде чем .htaccess перезапишет его.

Для некоторого тестирования я застрял в var_dump(path_segments());, и когда на /index.php/page он дает: array(2) { [0]=> string(0) "" [1]=> string(10) "proper-page" }. Однако, когда вы уберете R из приведенного выше правила перезаписи и получите доступ не только к /page, это просто даст: array(2) { [0]=> string(0) "" [1]=> string(0) "" }.


Теперь я даже не знаю, нужно ли мне беспокоиться о второй проблеме, если есть простой способ решить первую. Но, по крайней мере, это все, что я пытаюсь выяснить сейчас. Ценю всю помощь, которую я могу получить!


person user2089001    schedule 23.02.2013    source источник


Ответы (1)


Тогда у вас есть два варианта. Либо вы пропускаете использование PATH_INFO, адаптируя rewriterule, чтобы предоставить вам путь в качестве параметра GET:

  RewriteRule   ^(.*)$     index.php?path=$1  [L,QSA]

Таким образом, используйте $_GET["path"] сейчас.

Или переключитесь с использования $_SERVER["PATH_INFO"] и получите исходный входящий путь от $_SERVER["REQUEST_URI"]. Иногда также существуют альтернативные переменные окружения, такие как REDIRECT_PATH_INFO, отметьте print_r($_SERVER);.

person mario    schedule 23.02.2013
comment
Чувак! $_SERVER["REQUEST_URI"] полностью сработало! Я проверил print_r($_SERVER);, и он показал, что request_uri извлекает правильный тег, поэтому я заменил PATH_INFO на него, и все в порядке. Большое спасибо! (Извините, я не могу проголосовать за вас!) - person user2089001; 23.02.2013
comment
Все равно выдает 404. Использование InfinityFree. Должен ли я добавить что-нибудь еще? - person AliFurkan; 30.10.2019