Ссылка: mod переписать, URL переписать и" довольно ссылки " объяснил

"красивые ссылки" - часто запрашиваемая тема, но она редко полностью объясняется. mod_rewrite-один из способов сделать "красивые ссылки", но он сложен, и его синтаксис очень лаконичен, трудно Грок, и документация предполагает определенный уровень владения HTTP. Может ли кто-нибудь объяснить простыми словами, как работают "красивые ссылки" и как mod_rewrite можно использовать для их создания?

другие распространенные имена, псевдонимы, термины для чистых URL-адресов: RESTful URL-адреса, удобные для пользователя URL-адреса, SEO-дружественные URL-адреса, Slugging, MVC urls (возможно, неправильное название)

4 ответов


чтобы понять, что mod_rewrite вам сначала нужно понять, как работает веб-сервер. Веб-сервер отвечает HTTP-запросов. HTTP-запрос на самом базовом уровне выглядит следующим образом:

GET /foo/bar.html HTTP/1.1

это простой запрос браузера на веб-сервер, запрашивающий URL-адресом /foo/bar.html от него. Важно подчеркнуть, что он не запрашивает a , он запрашивает только произвольный URL-адрес. Запрос может также выглядеть так:

GET /foo/bar?baz=42 HTTP/1.1

это так же верно, как запрос на URL-адрес, и это, очевидно, не имеет ничего общего с файлами.

веб-сервер-это приложение, прослушивающее порт, принимающее HTTP-запросы, поступающие на этот порт, и возвращающее ответ. Веб-сервер полностью свободен отвечать на любой запрос любым способом, который он считает нужным/любым способом, который вы настроили для ответа. Этот ответ не является файлом, это HTTP response что может или может не иметь ничего общего с физическими файлами на любом диске. Веб-сервер не должен быть Apache, есть много других веб-серверов, которые все просто программы, которые работают постоянно и подключены к порту, который отвечает на HTTP-запросы. Вы можете написать его сами. Этот абзац был призван развести вас от любого понятия, что URL-адреса напрямую равны файлам, что действительно важно понять. :)

конфигурация по умолчанию для большинства веб-серверов-это поиск файла это соответствует URL-адресу на жестком диске. Если корень документа сервера установлено, скажем,/var/www, это может выглядеть ли файл /var/www/foo/bar.html существует и служит ему, если это так. Если файл заканчивается на ".php " он вызовет интерпретатор PHP и затем возвращает результат. Вся эта ассоциация полностью настраивается; файл не должен заканчиваться на ".php " для веб-сервера, чтобы запустить его через интерпретатор PHP, и URL-адрес не должен соответствовать какому-либо конкретному файлу на диске чтобы что-то случилось.

mod_rewrite-это способ переписать внутренняя обработка запроса. Когда веб-сервер получает запрос на URL /foo/bar вы можете переписать этот URL во что-то еще, прежде чем веб-сервер будет искать файл на диске, чтобы соответствовать ему. Простой пример:

RewriteEngine On
RewriteRule   /foo/bar /foo/baz

это правило говорит всякий раз, когда запрос соответствует "/foo/bar", перепишите его на "/foo/baz". запрос будет обработан, как если бы /foo/baz было предложено. Это можно использовать для различных эффектов, например:

RewriteRule (.*) .html

это правило соответствует чему угодно (.*) и захват он ((..)), затем переписывает его дописать ".формат HTML." Другими словами, если /foo/bar был запрошен URL-адрес, он будет обработан, как если бы /foo/bar.html было предложено. Вижу http://regular-expressions.info для получения дополнительной информации о регулярных выражения, фиксации и замены.

еще одно часто встречающееся правило:

RewriteRule (.*) index.php?url=

это, опять же, соответствует чему-либо и переписывает его в индекс файла.php с первоначально запрошенным URL-адресом, добавленным в url параметр запроса. Т. е., за любые и все запросы, поступающие в файл index.php выполняется, и этот файл будет иметь доступ к исходному запросу в $_GET['url'], поэтому он может делать с ним все, что захочет.

в первую очередь вы помещаете эти правила перезаписи в свой файл конфигурации веб-сервера. Apache также позволяет * поместить их в файл с именем .htaccess в корне документа (т. е. рядом с вашим .PHP-файл.)

* если разрешено основным файлом конфигурации Apache; это необязательно, но часто включено.

что делает mod_rewrite не do

mod_rewrite не волшебным образом делает все ваши URL-адреса "красивыми". Это распространенное недоразумение. Если у вас есть эта ссылка на вашем веб-сайте:

<a href="/my/ugly/link.php?is=not&amp;very=pretty">

нет ничего mod_rewrite может сделать, чтобы сделать это красиво. Для того, чтобы сделать это довольно ссылку, вы должны:

  1. измените ссылку на довольно ссылку:

    <a href="/my/pretty/link">
    
  2. используйте mod_rewrite на сервере для обработки запроса к URL /my/pretty/link используя любой из описанных выше методов.

(можно использовать mod_substitute в сочетании для преобразования исходящих HTML-страниц и их содержащихся ссылок. Хотя это обычно больше усилий, чем просто обновление HTML-ресурсам.)

есть много mod_rewrite может сделать и очень сложные правила соответствия вы можете создать, в том числе цепочки несколько перезаписей, проксирование запросов к совершенно другой службе или машине, возвращая конкретные коды состояния HTTP в качестве ответов, перенаправление запросов и т.д. Это очень мощно и может быть используется очень хорошо, если вы понимаете основной механизм HTTP-запроса-ответа. Это не автоматически сделать ваши ссылки довольно.

посмотреть официальная документация для всех возможных флагов и опций.


расширить на deceze это, я хотел бы привести несколько примеров и объяснить некоторые другие функции mod_rewrite.

все приведенные ниже примеры предполагают, что вы уже включили RewriteEngine On в своем .

Пример Переписать

давайте возьмем этот пример:

RewriteRule ^blog/([0-9]+)/([A-Za-z0-9-\+]+)/?$ /blog/index.php?id=&title= [NC,L,QSA]

правило разбито на 4 раздела:

  1. RewriteRule - начинает переписывать правило
  2. ^blog/([0-9]+)/([A-Za-z0-9-\+]+)/?$ - это называется шаблоном, однако я просто буду называть его левой стороной правила-то, что вы хотите переписать из
  3. blog/index.php?id=&title= - называется подстановка, или правая сторона правила перезаписи-что вы хотите переписать в
  4. [NC,L,QSA] флаги для Правила перезаписи, разделенные запятой, которое я объясню позже

вышеупомянутая переписка позволит вам связать что-то вроде /blog/1/foo/ и он действительно загрузится /blog/index.php?id=1&title=foo.

левая сторона правила

  • ^ указывает начало имени страницы-таким образом, он будет переписывать example.com/blog/... а не example.com/foo/blog/...
  • каждый набор (…) скобки представляют собой регулярное выражение, которое мы можем захватить как переменную в правой части правила. В этом примере:
    • первый набор скобок -([0-9]+) - соответствует строке длиной не менее 1 символа и только с числовыми значениями (т. е. 0-9). На это можно ссылаться с помощью в правой части правила
    • второй набор скобок соответствует строке длиной не менее 1 символа, содержащей только буквенно-цифровые символы (A-Z, a-z или 0-9) или - или + (Примечание + экранируется с обратной косой чертой, так как без экранирования это будет выполняться как regex символ повторения). На это можно ссылаться с помощью в правой руке сторона правила
  • ? означает, что предыдущий символ является необязательным, поэтому в этом случае оба /blog/1/foo/ и /blog/1/foo переписал бы на то же место
  • $ указывает, что это конец строки, которую мы хотим сопоставить

флаги

эти параметры добавляются в квадратные скобки в конце правила перезаписи для указания определенных условий. Опять же, есть много разных флагов, которые вы может читать в документация, но я пройду через некоторые из наиболее распространенных флагов:

NC

флаг no case означает, что правило перезаписи нечувствительно к регистру, поэтому для примера выше это будет означать, что оба /blog/1/foo/ и /BLOG/1/foo/ (или любое изменение этого) будет сопоставлено.

L

последний флаг указывает, что это последнее правило, которое должно быть обработано. Это означает, что если и только если это правило выполняется, никаких дополнительных правил будет оцениваться в текущем запуске обработки перезаписи. Если правило не совпадает, все остальные правила будут опробованы в обычном порядке. Если вы не установите L флаг, все следующие правила будут применены к переписан URL после этого.

END

С Apache 2.4 вы также можете использовать [END] флаг. Правило соответствия с ним будет полностью завершить дальнейшую обработку псевдонима / перезаписи. (А [L] флаг может часто вызывать второй раунд, например, при перезаписи в или из подкаталогов.)

QSA

флаг добавления строки запроса позволяет передавать дополнительные переменные в указанный URL-адрес, который будет добавлен к исходным параметрам get. Для нашего примера это означает, что что-то вроде /blog/1/foo/?comments=15 загрузите /blog/index.php?id=1&title=foo&comments=15

R

этот флаг не тот, который я использовал в примере выше, но я подумал, что стоит упомянуть. Это позволяет указать перенаправление http с помощью возможность включения кода состояния (например,R=301). Например, если вы хотите сделать 301 перенаправление на /myblog/ to / blog/, вы просто напишете правило примерно так:

RewriteRule ^/myblog/(*.)$ /blog/ [R=301,QSA,L]

Условия Переопределения

условия переопределения сделайте перезаписи еще более мощными, позволяя вам указывать перезаписи для более конкретных ситуаций. Есть много условий, о которых вы можете прочитать в документация, но я коснусь нескольких общих примеры и объясните их:

# if the host doesn't start with www. then add it and redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

это очень распространенная практика, которая будет добавлять ваш домен с www. (если его еще нет) и выполните перенаправление 301. Например, загрузка http://example.com/blog/ это перенаправит вас на http://www.example.com/blog/

# if it cant find the image, try find the image on another domain
RewriteCond %{REQUEST_URI} \.(jpg|jpeg|gif|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)$ http://www.example.com/ [L]

это немного реже, но является хорошим примером правила, которое не выполняется, если имя каталога или файла, который существует на сервере.

  • %{REQUEST_URI} \.(jpg|jpeg|gif|png)$ [NC] будет выполняться только в перепишите файлы с расширением jpg, jpeg, gif или png (без учета регистра).
  • %{REQUEST_FILENAME} !-f проверит, существует ли файл на текущем сервере, и только выполнит перезапись, если это не
  • %{REQUEST_FILENAME} !-d проверит, существует ли файл на текущем сервере, и только выполнит перезапись, если это не
  • перезапись попытается загрузить тот же файл в другой домен

ссылки

переполнение стека имеет много другие большие ресурсы, чтобы начать работу:

и новичок дружественных regex обзоры даже:

часто используемые заполнители

  • .* соответствует чему угодно, даже пустой строке. Вы не хотите использовать этот шаблон везде, но часто в последнем резервном правиле.
  • [^/]+ чаще используется для отрезки пути. Он матчи угодно, но не Слэш.
  • \d+ соответствует только числовым строкам.
  • \w+ соответствует буквенно-цифровых символов. Это в основном стенография для [A-Za-z0-9_].
  • [\w\-]+ для сегментов пути в стиле"slug", используя буквы, цифры, тире - и _
  • [\w\-.,]+ добавляет точки и запятые. Предпочитаю сбежать \- тире […] charclasses.
  • \. обозначает a буквальный период. В противном случае . за пределами […] вместо любого символа.

каждый из этих заполнителей обычно заворачивают в (…) скобках, как группа захвата. И вся картина часто в ^………$ start + end маркеры. Цитирование "шаблонов" является необязательным.

RewriteRules

следующие примеры ориентированы на PHP и немного более инкрементальны, их легче адаптировать для подобных случаев. Это просто резюме, часто ссылающиеся на больше изменений или детального Q&As.

  • статическое сопоставление
    /contact, /about

    сокращение нескольких имен страниц до внутренних файловых схем наиболее просто:

     RewriteRule ^contact$  templ/contact.html
     RewriteRule ^about$    about.php
    
  • числовые идентификаторы
    /object/123

    введение ярлыков, таких как http://example.com/article/531 к существующим PHP скриптам также легко. Числовой заполнитель может просто быть перенесен на :

     RewriteRule ^article/(\d+)$    article-show.php?id=
     #                      └───────────────────────────┘
    
  • заполнители в стиле Slug
    /article/with-some-title-slug

    вы можете легко расширить это правило, чтобы позволить /article/title-string заполнители:

     RewriteRule ^article/([\w-]+)$    article-show.php?title=
     #                       └────────────────────────────────┘
    

    обратите внимание, что скрипт должны иметь возможность (или быть адаптированным) сопоставить эти заголовки с идентификаторами базы данных. Только переписчики не могут создавать или угадывать информацию из тонкого воздух.

  • слизни с числовыми префиксами
    /readable/123-plus-title

    поэтому вы часто будете видеть смешанные /article/529-title-slug пути, используемые на практике:

     RewriteRule ^article/(\d+)-([\w-]+)$    article.php?id=&title=
     #                      └───────────────────────────────┘
    

    теперь вы можете просто пропустить мимо title= в любом случае, потому что ваш скрипт обычно будет полагаться на идентификатор базы данных. The -title-slug стал произвольным украшением URL.

  • единообразие с альтернативными списками
    /foo/… /bar/… /baz/…

    если у вас есть аналогичные правила для нескольких виртуальных путей страницы, то вы можете сопоставить и сжать их с | альтернативные списки. И снова просто переназначьте их на внутренние параметры GET:

     #                               ┌─────────────────────────┐
     RewriteRule ^(blog|post|user)/(\w+)$  disp.php?type=&id=
     #               └───────────────────────────────────┘
    

    вы можете разделить их на отдельные RewriteRules должен быть слишком сложным.

  • отправка связанных URL-адресов в разные backends
    /date/SWITCH/backend

    более практичным использованием альтернативных списков является сопоставление путей запросов с различными сценариями. Например, чтобы предоставить единообразные URL-адреса для старого и нового веб-приложения на основе дат:

     #                   ┌─────────────────────────────┐
     #                   │                 ┌───────────┼───────────────┐
     RewriteRule ^blog/(2009|2010|2011)/([\d-]+)/?$ old/blog.php?date=
     RewriteRule ^blog/(\d+)/([\d-]+)/?$  modern/blog/index.php?start=
     #                          └──────────────────────────────────────┘
    

    это просто переназначает сообщения 2009-2011 на один скрипт, а все остальные годы неявно на другой обработчик. Примечание более конкретное правило на первом месте. Каждый скрипт может использовать разные GET парамы.

  • другие разделители, чем просто / пути слеши
    /user-123-name

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

     RewriteRule ^user-(\d+)$    show.php?what=user&id=
     #                   └──────────────────────────────┘
     # This could use `(\w+)` alternatively for user names instead of ids.
    

    Для также общего /wiki:section:Page_Name схема:

     RewriteRule ^wiki:(\w+):(\w+)$  wiki.php?sect=&page= 
     #                   └─────┼────────────────────┘       │
     #                         └────────────────────────────┘
    

    иногда это подходит для чередования между /-разделители и : или . в том же правиле даже. Или опять два RewriteRules для сопоставления вариантов на разные сценарии.

  • дополнительно трейлинг / полоснуть
    /dir = /dir/

    выбирая пути в стиле каталога, вы можете сделать его доступным С и без окончательного /

     RewriteRule ^blog/([\w-]+)/?$  blog/show.php?id=
     #                         ┗┛
    

    теперь это ручки как http://example.com/blog/123 и /blog/123/. И /?$ подход легко добавить на любой другой RewriteRule.

  • гибкие сегменты для виртуальных путей
    .*/.*/.*/.*

    большинство правил вы столкнетесь карта ограниченный набор /…/ сегменты пути к ресурсам для отдельных параметров GET. Некоторые скрипты обрабатывать переменное количество параметров однако. Движок регулярных выражений Apache не разрешить опционирование произвольного числа из них. Но вы можете легко развернуть его в блок правил самостоятельно:

     Rewriterule ^(\w+)/?$                in.php?a=
     Rewriterule ^(\w+)/(\w+)/?$          in.php?a=&b=
     Rewriterule ^(\w+)/(\w+)/(\w+)/?$    in.php?a=&b=&c=
     #              └─────┴─────┴───────────────────┴────┴────┘
    

    Если вам нужно до пяти сегментов пути, скопируйте эту схему в пять правил. Вы можете, конечно, использовать более конкретный [^/]+ заполнитель каждого. Здесь порядок не так важен, как ни то, ни другое. Поэтому иметь наиболее часто используемые пути в первую очередь нормально.

    в качестве альтернативы вы можете использовать параметры массива PHPs через ?p[]=&p[]=&p[]=3 запрос строка здесь-Если ваш скрипт просто предпочитает их предварительно разделить. (Хотя чаще всего просто использовать правило catch-all и позволить скрипту самому расширять сегменты из REQUEST_URI.)

    Читайте также: как преобразовать сегменты пути URL в пары ключ-значение строки запроса?

  • дополнительные сегменты
    prefix/opt?/.*

    общее изменение иметь опционные префиксы внутри правило. Обычно это имеет смысл, если у вас есть статические строки или более ограниченные заполнители:

      RewriteRule ^(\w+)(?:/([^/]+))?/(\w+)$  ?main=&opt=&suffix=
    

    теперь более сложный рисунок (?:/([^/])+)? там просто обертывает не захват (?:…) group, и делает его необязательным )?. Содержащиеся заполнитель ([^/]+) будет замена шаблона , но быть пустым, если нет среднего /…/ путь.

  • записать остаток
    /prefix/123-capture/…/*/…whatever…

    как уже говорилось ранее, вы не часто хотите слишком общие шаблоны перезаписи. Однако имеет смысл комбинировать статические и конкретные сравнения с .* иногда.

     RewriteRule ^(specific)/prefix/(\d+)(/.*)?$  speci.php?id=&otherparams=
    

    этот optionalized любой /…/…/… конечные отрезки пути. Что, конечно же, требует скрипта обработки, чтобы разделить их, и variabl-ify извлеченных параметров сам (что и есть Web - "MVC" рамки делают).

  • завершающий файл "extensions"
    /old/path.HTML

    URLs на самом деле не имеют расширений файлов. Вот о чем вся эта ссылка (= URL-адреса-это виртуальные локаторы, не обязательно прямой образ файловой системы). Однако, если у вас было сопоставление файлов 1:1 раньше, вы can ремесло более простые правила:

     RewriteRule  ^styles/([\w\.\-]+)\.css$  sass-cache.php?old_fn_base=
     RewriteRule  ^images/([\w\.\-]+)\.gif$  png-converter.php?load_from=
    

    другие распространенные приложения переназначение устаревших .html пути к новой .php обработчики или просто псевдонимы имен каталогов только для отдельных (фактических/реальных) файлов.

  • пинг-понг (перенаправляет и переписывает в унисон)
    /ugly.html ←→ /pretty

    поэтому в какой-то момент вы переписываете свои HTML-страницы, чтобы нести только красивые ссылки, как очерченный deceze. Тем временем вы все равно будете получать запросы на старый пути, иногда даже от книжные закладки. As решение, вы можете пинг-понг браузеры для отображения/установить новые URL.

    этот общий трюк включает в себя отправку 30x / Location редирект всякий раз, когда входящий URL следует устаревшей/уродливой схеме именования. Браузеры будут тогда rerequest новый / довольно URL, который впоследствии переписывается (только внутри) в исходное или новое место.

     # redirect browser for old/ugly incoming paths
     RewriteRule ^old/teams\.html$ /teams [R=301,QSA,END]
    
     # internally remap already-pretty incoming request
     RewriteRule ^teams$ teams.php        [QSA,END]
    

    обратите внимание, как этот пример просто использует [END] вместо [L] безопасно чередоваться. Для более старых версий Apache 2.2 вы можете использовать другие обходные пути, а также переназначение например, параметры строки запроса: перенаправить уродливый довольно URL, переназначить обратно на уродливый путь, без бесконечных циклов

  • помещения в структуре
    /this+that+

    это не этого достаточно в адресных строках браузера, но вы можете использовать пробелы в url. Для перезаписи шаблонов используйте обратную косую черту-escaped \␣ пробелы. Иначе просто "-процитируйте весь шаблон или замену:

     RewriteRule  "^this [\w ]+/(.*)$"  "index.php?id="  [L]
    

    клиенты сериализуют URL-адреса с помощью + или %20 для пространства. Однако в RewriteRules они интерпретируются буквальными символами для всех относительных сегментов пути.

частые повторы:

преобладает .htaccess подводные камни

Теперь возьмите это с зерном соли. Не каждый совет можно обобщить на все контексты. Это всего лишь простое резюме известных и нескольких неочевидных камней преткновения:

  • включить mod_rewrite и .htaccess

    на самом деле использовать RewriteRules в файлах конфигурации для каждого каталога необходимо:

    • проверить, что ваш сервер имеет AllowOverride All включено. В противном случае ваш per-directory .htaccess директивы будут игнорироваться, а Перезаписывающие не будут работать.

    • очевидно есть mod_rewrite включено в своем модули.

    • добавить каждый список правил с RewriteEngine On по-прежнему. В то время как mod_rewrite неявно активен в <VirtualHost> и <Directory> разделы, каталог.htaccess файлы нуждаются в индивидуальном вызове.

  • ведущий слеш ^/ не соответствует

    вы не должны начинать свой .htaccess шаблоны RewriteRule с ^/ обычно:

     RewriteRule ^/article/\d+$  …
                  ↑
    

    это часто встречается в старых учебниках. И это было правильно для древнего Apache 1.X версий. В настоящее время пути запросов удобно полностью вы не хочу что обычно в свой .htaccess файлы.

    • во-первых, mod_rewrite не отключается случайным образом. (Если бы это было так, у вас были бы большие проблемы).
    • если бы он действительно был отключен, ваши перезаписи все равно не работали бы.
    • он предназначен для предотвращения HTTP 500 ошибки. То, что он обычно выполняет, - это изящество пользователи с HTTP ошибки. (Не столько более удобный, если вы думаете об этом.)
    • практически он просто подавляет более полезные записи журнала или уведомления сервера. Ты был бы не знаю о том, почему ваши переписчики никогда не работают.

    что кажется заманчивым как обобщенная защита, часто оказывается препятствием в практиковать.

  • не используйте RewriteBase если не нужны

    многие примеры копирования + вставки содержат . Это неявно перестраивает относительные ссылки на то, чем они были раньше.

вы могли бы в качестве альтернативы ремесло дальнейшие переписчики для rebind .css или .png пути к их исходному положению. Но это и ненужно, или вызывает дополнительные перенаправления и препятствует кэшированию.

Читайте также: CSS, JS и изображения не отображаются с довольно url

  • RewriteConds просто замаскировать один RewriteRule

    общий misinterpetation, что RewriteCond блокирует множественные RewriteRules (потому что они визуально устроены вместе):

     RewriteCond %{SERVER_NAME} localhost
     RewriteRule ^secret  admin/tools.php
     RewriteRule ^hidden  sqladmin.cgi
    

    который он не по умолчанию. Ты можешь!--712-->цепи их с помощью [S=2] флаг. Иначе придется повторить. Хотя иногда вы можете создать "перевернутое" основное правило для [завершения] обработки перезаписи раньше.

  • QUERY_STRING освобождается от перезаписи

    вы не можете соответствовать RewriteRule index.php\?x=y, потому что mod_rewrite сравнивает только с относительными путями по умолчанию. Вы можете сопоставить их отдельно однако через:

     RewriteCond %{QUERY_STRING} \b(?:param)=([^&]+)(?:&|$)
     RewriteRule ^add/(.+)$  add/%1/  # ←──﹪₁──┘
    

    см. также как я могу сопоставить строковые переменные запроса с mod_rewrite?

  • .htaccess и <VirtualHost>

    если вы используете перезаписи в файле конфигурации для каждого каталога, то беспокоиться о производительности регулярных выражений бессмысленно. Apache сохраняет скомпилированные шаблоны PCRE дольше, чем процесс PHP с общей структурой маршрутизации. Однако для сайтов с высоким трафиком следует учитывать двигаясь правил в конфигурацию сервера vhost, как только они будут проверены в бою.

    в этом случае предпочтите optionalized ^/? префикс разделителя каталогов. Это позволяет свободно перемещать перезаписи между PerDir и сервером конфигурационный файл.

  • всякий раз, когда что-то не работает

    не волнуйтесь.

    • сравнить access.log и error.log

      часто вы можете понять, как RewriteRule ведет себя просто глядя на ваш error.log и access.log. Коррелируйте время доступа, чтобы увидеть, какой путь запроса первоначально пришел, и какой путь/файл Apache не смог решить (ошибка 404/500).

      это не говорит вам, какой переписчик является виновником. Но недоступные конечные пути, такие как /docroot/21-.itle?index.php может дать прочь где проверить дальше. В противном случае отключите правила, пока не получите некоторые предсказуемые пути.

    • включить RewriteLog

      посмотреть Apache RewriteLog документы. Для отладки вы можете включить его в разделах vhost:

      # Apache 2.2
      RewriteLogLevel 5
      RewriteLog /tmp/rewrite.log
      
      # Apache 2.4
      LogLevel alert rewrite:trace5
      #ErrorLog /tmp/rewrite.log
      

      это дает подробную сводку о том, как пути входящих запросов изменяются каждым правилом:

      [..] applying pattern '^test_.*$' to uri 'index.php'
      [..] strip per-dir prefix: /srv/www/vhosts/hc-profi/index.php -> index.php
      [..] applying pattern '^index\.php$' to uri 'index.php'
      

      что помогает сузить слишком общие правила и ошибки регулярного выражения.

      Читайте также:
      · .реврайт не работает (модуля mod_rewrite)
      · советы по отладке .С. htaccess правила перезаписи

    • прежде чем задать свой собственный вопрос

      как вы знаете, Stack Overflow очень подходит для вопросов по mod_rewrite. Сделайте их на тему включив предыдущие исследования и попытки (избегайте избыточных ответов), продемонстрируйте basic regex понимание, и:

      • включить полное примеры входных URL-адресов, ложно переписанные целевые пути, ваша реальная структура каталогов.
      • полный набор RewriteRule, но и один из предполагаемых дефектных один.
      • версии Apache и PHP, тип ОС, файловая система, DOCUMENT_ROOT и PHPs $_SERVER среда, если речь идет о несоответствии параметров.
      • отрывок из своего access.log и error.log для проверьте, что разрешены существующие правила. А еще лучше-а rewrite.log резюме.

      этой сети быстрее и более точные ответы, и делает их более полезными для других.

  • комментарий .htaccess

    если вы копируете примеры откуда-то, позаботьтесь включить # comment and origin link. Пока это просто невоспитанность опустить атрибуции, это часто действительно вредит обслуживанию позже. Документировать любой код или учебник источник. В частности, в то время как unversed вы должны быть тем более не стоит относиться к ним как к волшебным черным ящикам.

  • это не "SEO" - URLs

    отказ от ответственности: просто животное peeve. вы часто слышите довольно схемы перезаписи URL, называемые ссылками " SEO " или что-то в этом роде. Хотя это полезно для примеров googling, это датированное неправильное название.

    ни одна из современных поисковых систем действительно не нарушается .html и .php в сегментах пути или ?id=123 строки запроса, если на то пошло. Поисковые системы старых, таких как AltaVista,сделал избегайте обхода веб-сайтов с потенциально неоднозначными путями доступа. Современные искатели часто даже жаждут глубоких веб-ресурсов.

    какие" красивые " URL-адреса следует концептуально использовать для создания веб-сайтов удобный.

    1. имея читаемый и очевидный ресурс схемы.
    2. обеспечение URL-адресов долговечны (АКА постоянные).
    3. обеспечение видимости через /common/tree/nesting.

    однако не жертвуйте уникальными требованиями для конформизма.

  • инструменты

    существуют различные онлайн-инструменты для создания перезаписей для большинства GET-parameterish URL-адреса:

    в основном просто выход [^/]+ общие заполнители, но, вероятно, достаточно для тривиальных сайтов.


    альтернативы и mod_rewrite

    многие базовые виртуальные схемы url может быть достигнуто без использования RewriteRules. Apache позволяет вызывать PHP-скрипты без