Я использую Apache для обслуживания блога, состоящего из статических файлов HTML. В настоящее время в блоге используется довольно стандартная структура URL-адресов, например:
/2010/03/21/my-awesome-blog-post/
который соответствует файлу
/2010/03/21/my-awesome-blog-post/index.html
используя Apache mod_dir
.
Я бы хотел удалить косую черту в конце, чтобы URL-адреса
/2010/03/21/my-awesome-blog-post
работают таким же образом (и не перенаправляются). Есть ли способ сделать это с помощью Apache?
(Обратите внимание, что мне нужны URL-адреса с участием косую черту в конце, чтобы продолжить работу.)
(Дальнейшее примечание: я видел кое-что о Apache DirectorySlash
директиву, но я не думаю, что она делает то, что я хочу ... хотя я в этом не уверен.)
В руководстве по перезаписи Apache есть глава "Проблема с косой чертой" (прокрутите немного вниз), объясняя, как решить проблему с косой чертой в конце.
Однако они также заявляют, что завершающая косая черта требуется для каталогов, когда отображаемая в ней страница использует ресурсы (изображения, таблицы стилей, ..) с относительными ссылками, которые не будут работать без косой черты:
"Решение этой тонкой проблемы состоит в том, чтобы позволить серверу автоматически добавлять завершающую косую черту. Чтобы сделать это правильно, мы должны использовать внешнее перенаправление, чтобы браузер правильно запрашивал последующие изображения и т. Д. Если бы мы выполняли только внутреннюю перезапись, это было бы только работать для страницы каталога, но будет работать неправильно, если на эту страницу будут включены изображения с относительными URL-адресами, потому что браузер запросит встроенный объект. Например, запрос image.gif в / ~ quux / foo / index .html превратился бы в /~quux/image.gif без внешнего перенаправления! "
Вы всегда можете использовать mod_rewrite для перенаправления имени каталога без косой черты на dirname/index.html
. Вы можете использовать RedirectConds, чтобы убедиться, что перенаправление не выполняется, если URL-адрес заканчивается косой чертой или .html, и что он применяется только к URL-адресам сообщений в блогах.
Позвольте мне привести пример, это займет немного времени.
# Trailing slashes and .html suffix
RewriteCond !/$
RewriteCond !\.html$
# Check if it's actually a dir and if index.html exists
RewriteCond %{REQUEST_URI} -d
RewriteCond %{REQUEST_URI}/index.html -f
# Rewrite anything that gets through (Probably insecure, but you get the idea)
RewriteRule ^(.*)$ $1/index.html
Редактировать: Может также сочетаться с решением Мэтта о добавлении кода ошибки перенаправления в RewriteRule. Вероятно, его также следует сделать последним RedirectRule. Обратитесь к документация по mod_rewrite для большего.
Удалить index.php из URL-адреса можно, написав только две строки в вашем файле .htaccess (mod_rewrite в Apache). Перед написанием правил в .htaccess убедитесь, что на вашем сервере Apache включен mod_rewrite (RewriteEngine On). Скорее всего, mod_rewrite включен на сервере Linux, но для сервера Windows вам может потребоваться связаться с хостингом, чтобы включить mod_rewrite. Вы можете проверить это, заглянув в phpinfo ().
Ниже приведены правила, которые удаляют index.php из URL:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /([^/]+/)*index.php HTTP/
RewriteRule ^(([^/]+/)*)index.php$ http://www.%{HTTP_HOST}/ [R=301,NS,L]
Редирект 301 означает «Перемещено навсегда», поэтому большинство поисковых систем удаляют index.php из URL.
Вы читали определение DirectorySlash?
В
DirectorySlash
директива определяет, есть лиmod_dir
должен исправить URL-адреса, указывающие на каталог, или нет.Обычно, если пользователь запрашивает ресурс без косой черты, указывающей на каталог,
mod_dir
перенаправляет его на тот же ресурс, но с завершающей косой чертой по веским причинам:
- Наконец, пользователь запрашивает канонический URL-адрес ресурса.
mod_autoindex
работает правильно. Поскольку он не указывает путь в ссылке, он укажет неверный путь.DirectoryIndex
будет оцениваться только для каталогов, запрошенных с завершающей косой чертой.- Относительные URL-ссылки внутри html-страниц будут работать правильно.
Что ж, если вам не нужен этот эффект и приведенные выше причины к вам не относятся, вы можете отключить перенаправление с помощью:
# see security warning below! <Location /some/path> DirectorySlash Off SetHandler some-handler </Location>
У меня была та же проблема, но я использовал mod_alias для создания дочернего сайта. Оказывается, мне нужно было сделать второй псевдоним без косой черты, чтобы он работал правильно. Выглядело примерно так:
Alias /forum/ "/var/www/forum"
Alias /forum "/var/www/forum"
<Directory "/var/www/forum">
Options FollowSymlinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
В Ubuntu мне пришлось отредактировать /etc/apache2/mods-enabled/alias.conf файл с этими строками, затем перезапустите apache. Не удалось найти этот ответ в Интернете; Я просто наткнулся на это сам, так как mod_rewrite не работал, и команда DirectorySlash тоже не помогла. Я добавлял программу, не относящуюся к Drupal, в качестве подсайта при установке Drupal, что в первую очередь положило начало всему этому безумию ...
Вы можете попробовать псевдоним: http://httpd.apache.org/docs/2.0/mod/mod_alias.html