Скрыть расширения страницы (например, StackOverflow)

Я хочу скрыть расширения страниц, например, stackoverflow. Как работает следующая работа?

http://stackoverflow.com/tags/foo
http://stackoverflow.com/tags/bar

Я видел много сайтов, которые это делают, но я до сих пор не знаю, как это делается (у меня есть стек LAMP).

Ответ 1

Когда веб-сервер получает запрос на URL-адрес, он должен решить, как его обрабатывать. Классический метод состоял в том, чтобы сопоставить головку URL-адреса с каталогом в файловой системе, а затем остальной URL-адрес перейти к файлу в файловой системе. В результате URL-адреса имели расширения файлов.

Но нет необходимости делать это таким образом, и большинство новых веб-фреймворков этого не делают. Они позволяют программисту определить, как сопоставить URL-адрес для запуска кода, поэтому нет необходимости в расширениях файлов, поскольку нет единого файла, обеспечивающего ответ.

В вашем примере отсутствует каталог "тегов", содержащий файлы "foo" и "bar". URL-адрес "тегов" сопоставляется с кодом, который использует остальную часть URL-адреса ( "foo" или "bar" ) в качестве параметра в запросе к базе данных данных тега.

Ответ 2

То, что вы хотите, это чистые URL-адреса, и вы можете сделать это с помощью apache и .htaccess. Может быть, лучший способ, но вот как я это делал:

http://evolt.org/Making_clean_URLs_with_Apache_and_PHP

Ответ 3

Что красота и работа ASP.NET MVC.

Нет "скрытия" - это просто способ, которым ASP.NET MVC обрабатывает URL-адрес и сопоставляет эти "маршруты" с действиями контроллера на ваших классах контроллеров.

Довольно большой шаг от "классического" способа создания ASP.NET Webforms.

Ответ 4

Существует несколько способов сделать это в Apache + PHP, но основным принципом является создание набора URI (возможно, всех URI, в зависимости от вашего сайта, но вы можете захотеть, чтобы разные скрипты обрабатывали разные части сайт) перевести на один файл PHP, которому сообщается, какой объект запросил пользователь.

Концептуально проще всего переписать каждый URL-адрес на script, который получает URI через $_SERVER['REQUEST_URI'] и интерпретирует его как ему нравится.

Редактирование URI может выполняться различными способами, включая mod_rewrite, mod_alias и ErrorDocument (см. документы Apache).

Другим способом является создание более сложной перезаписи URL (возможно, с помощью mod_rewrite), чтобы добавить путь в качестве переменной GET.

Существует также переменная $_SERVER['PATH_INFO'], которая загружается несуществующей частью пути. Этот параметр требует незначительных изменений или вообще не изменяет конфигурационные файлы Apache, но немного уменьшает гибкость ваших URL.

Ответ 5

Современные рамки веб-разработки поддерживают элегантные URL-адреса. Проверьте Django или Ruby on Rails.

Ответ 6

Если вы используете 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>

Apache 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