Скрыть расширения страницы (например, StackOverflow) - PullRequest
2 голосов
/ 19 ноября 2009

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

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

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

Ответы [ 6 ]

6 голосов
/ 19 ноября 2009

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

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

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

3 голосов
/ 19 ноября 2009

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

http://evolt.org/Making_clean_URLs_with_Apache_and_PHP

2 голосов
/ 19 ноября 2009

В этом вся прелесть ASP.NET MVC .

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

Довольно далеко от «классического» способа работы ASP.NET Webforms.

0 голосов
/ 19 ноября 2009

Если вы используете 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
0 голосов
/ 19 ноября 2009

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

0 голосов
/ 19 ноября 2009

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

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

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

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

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

...