Вопрос

Я хочу скрыть расширения страниц, как это делает 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.Возможно, есть лучший способ, но вот как я это делаю:

http://evolt.org/Making_clean_URLs_with_Apache_and_PHP

В этом красота и работа АСП.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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top