Назад | Перейти на главную страницу

Использование mod_rewrite для удаления PATH_INFO из URL

ОБНОВЛЕНИЕ: в основном решено. Теперь это не работает, только если в ситуации, когда вы пытаетесь получить доступ http://www.example.com/any-real-file-without-an-extension/anything-afterwards-that-doesnt-end-in-a-slash. Я думаю, сервер думает, что any-real-file-without-an-extension может быть каталог ... не знаю, как это исправить.

PHP определяет PATH_INFO как часть URL-адреса, который:

Содержит любую предоставленную клиентом информацию о пути после фактического имени файла сценария, но предшествует строке запроса, если таковая имеется. Например, если доступ к текущему скрипту был осуществлен через URL http://www.example.com/php/path_info.php/some/stuff?foo=bar, затем $_SERVER['PATH_INFO'] будет содержать /some/stuff.

На данный момент мой сайт обрабатывает http://example.com/ contact_us.php/ANYTEXTCANGOHERE так как http://example.com/contact_us.php

В таком случае, /ANYTEXTCANGOHERE это PATH_INFO. Я хотел бы сделать так, чтобы либо эта информация о пути удалялась до имени файла, либо в противном случае возвращалось 404. Как я могу это сделать?

Вот что мой .htaccess похоже сейчас. Все очень просто. Просто 301 редирект на www и косые черты в конце, а также что-то, что заставляет связываться с файлами без расширений и перезаписывать без расширений. У меня нет корневого доступа к серверу.

ErrorDocument 404 /404.php
ErrorDocument 503 /503.php

#Force www:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^foodthing.org [NC]
RewriteRule ^(.*)$ http://www.foodthing.org/$1 [L,R=301,NC]

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foodthing\.org$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

#1)externally redirect "/file.php" to "/file"   
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
#2)Internally map "/file" back to "/file.php"
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,L]

Чтобы отключить дополнительную информацию о пути, вам просто нужно отключить AcceptPathInfo в конфигурации сервера (или .htaccess файл). Например:

AcceptPathInfo Off

Любой URL-адрес, содержащий информацию о пути, теперь будет запускать 404.