2009-11-18 2 views
2

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

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

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

ответ

6

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

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

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

+0

Спасибо за объяснение. – sels520

3

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

http://evolt.org/Making_clean_URLs_with_Apache_and_PHP

+3

Чтобы уточнить - StackOverflow не скрывает расширения, он использует MVC для определения маршрутов, соответствующих представлениям. –

+0

Обычно они соответствуют методам контроллера, но многие из них имеют одинаково названные виды. – JasonTrue

2

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

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

Достаточно большой шаг от «классического» способа ASP.NET Webforms.

+1

Я с нетерпением жду этого прихода к веб-формам в ASP.NET 4.0 –

0

Существует несколько способов сделать это под 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.

0

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^