Скрыть расширения страниц (например, StackOverflow)
-
20-09-2019 - |
Вопрос
Я хочу скрыть расширения страниц, как это делает stackoverflow.Как работает следующее?
http://stackoverflow.com/tags/foo
http://stackoverflow.com/tags/bar
Я видел много сайтов, которые это делают, но до сих пор не знаю, как это сделать (у меня есть стек LAMP).
Решение
Когда веб-сервер получает запрос на URL-адрес, он должен решить, как его обработать.Классический метод заключался в том, чтобы сопоставить заголовок URL-адреса с каталогом в файловой системе, а затем позволить остальной части URL-адреса перейти к файлу в файловой системе.В результате URL-адреса имели расширения файлов.
Но нет необходимости делать это таким образом, и большинство новых веб-фреймворков этого не делают.Они позволяют программисту определить, как сопоставить URL-адрес с кодом для запуска, поэтому нет необходимости в расширениях файлов, поскольку не существует единого файла, предоставляющего ответ.
В вашем примере нет каталога «теги», содержащего файлы «foo» и «bar».URL-адрес «тегов» сопоставляется с кодом, который использует остальную часть URL-адреса («foo» или «bar») в качестве параметра в запросе к базе данных данных тегов.
Другие советы
Вам нужны чистые URL-адреса, и вы можете сделать это с помощью apache и .htaccess.Возможно, есть лучший способ, но вот как я это делаю:
В этом красота и работа АСП.NET MVC.
Никакого «сокрытия» — это просто способ, которым ASP.NET MVC обрабатывает URL-адреса и сопоставляет эти «маршруты» с действиями контроллера в ваших классах контроллера.
Довольно большой шаг в сторону от «классического» способа ведения дел ASP.NET Webforms.
Есть несколько способов сделать это в Apache+PHP, но основной принцип заключается в том, чтобы перевести набор URI (возможно, все URI, в зависимости от вашего сайта, но вам могут потребоваться разные сценарии для обработки разных частей сайта). в один PHP-файл, в котором сообщается, какой объект запросил пользователь.
Концептуально самый простой способ — переписать каждый URL-адрес в скрипт, который передает URI через $_SERVER['REQUEST_URI']
и интерпретирует это как хочет.
Перезапись URI можно выполнить различными методами, включая mod_rewrite, mod_alias и ErrorDocument (см. документацию Apache).
Другой способ — настроить более сложную перезапись URL-адресов (вероятно, с использованием mod_rewrite), чтобы добавить путь в виде переменной GET.
Существует также $_SERVER['PATH_INFO']
переменная, которая загружается с помощью несуществующий часть пути.Этот вариант практически не требует изменений в файлах конфигурации Apache, но немного снижает гибкость ваших URL-адресов.
Современные среды веб-разработки поддерживают элегантные URL-адреса.Проверить Джанго или Рубин на рельсах.
Если вы используете Apache и просто хотите скрыть расширения статических файлов HTML, вы можете использовать это .htaccess
код:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f # if the requested URL is not a file that exists
RewriteCond %{REQUEST_FILENAME} !-d # and it isn't a directory that exists either
RewriteCond %{REQUEST_FILENAME}\.html -f # but when you put ".html" on the end it is a file that exists
RewriteRule ^(.+)$ $1\.html [QSA] # then serve that file
</IfModule>
Апач mod_rewrite
его называли «вуду, но серьезно крутое вуду».
Настоящий .htaccess
код, который я использую на нескольких сайтах, похож на этот, но не идентичен:
<IfModule mod_rewrite.c>
RewriteEngine on
#RewriteRule ^$ index.php [QSA]
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1\.php [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/$1 [QSA]
</IfModule>
А вот гораздо более длинный, но гораздо более читаемый код, позволяющий сделать то же самое на сервере Zeus.На Зевсе это называется rewrite.script
.
# http://drupal.org/node/46508
# get the document root
map path into SCRATCH:DOCROOT from /
# initialize our variables
set SCRATCH:ORIG_URL = %{URL}
set SCRATCH:REQUEST_URI = %{URL}
match URL into $ with ^(.*)\?(.*)$
if matched then
set SCRATCH:REQUEST_URI = $1
set SCRATCH:QUERY_STRING = $2
endif
# prepare to search for file, rewrite if its not found
set SCRATCH:REQUEST_FILENAME = %{SCRATCH:DOCROOT}
set SCRATCH:REQUEST_FILENAME . %{SCRATCH:REQUEST_URI}
# check to see if the file requested is an actual file or
# a directory with possibly an index. don't rewrite if so
look for file at %{SCRATCH:REQUEST_FILENAME}
if not exists then
look for dir at %{SCRATCH:REQUEST_FILENAME}
if not exists then
look for file at %{SCRATCH:REQUEST_FILENAME}.php
if exists then
set URL = %{SCRATCH:REQUEST_URI}.php?%{SCRATCH:QUERY_STRING}
else
set URL = /index.php/%{SCRATCH:REQUEST_URI}?%{SCRATCH:QUERY_STRING}
endif
endif
endif
goto END