Как сделать перенаправление mod_rewrite на относительный URL - PullRequest
9 голосов
/ 14 октября 2011

Я пытаюсь добиться базового перенаправления URL для pretty-URL, и из-за изображений, CSS и т. Д., Также находящихся по тому же пути, мне нужно убедиться, что если к URL-адресу обращаются без завершающей косой черты, он добавляется автоматически.

Это прекрасно работает, если я добавлю абсолютный URL-адрес следующим образом:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ http://www.mydomain.com/myParentDir/$1/ [R,nc,L]

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

Это то, что я пробовал, и все они не работают или перенаправляют меня на фактический внутренний путь к каталогу сервера, например / public_html / ...:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ ./myParentDir/$1/ [R,nc,L]

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ myParentDir/$1/ [R,nc,L]

Как правильно перенаправить URL-адрес, если пользователь вводит что-то вроде:

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir

он перенаправляется на (через HTTP 301 или 302):

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir/

Спасибо.

РЕДАКТИРОВАТЬ : добавление некоторых дополнительных деталей, потому что они не совсем понятны. Допустим, я реализую галерею, и я хочу иметь красивые URL-адреса с использованием mod_rewrite. Итак, я хотел бы, чтобы URL-адреса были следующими:

http://www.mydomain.com/somedir/galleries/cats

, который показывает миниатюры кошек, а:

http://www.mydomain.com/somedir/galleries/cats/persian

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

http://www.domain.com/somedir/gallery.php?category=cats&image=persian

Итак, я хочу поместить файл .htaccess в / somedir, который перехватывает все запросы к / galleries и, в зависимости от виртуальных подкаталогов, следующих за ним, использует их в качестве заполнителей при переписывании с двумя правилами перезаписи:

RewriteRule ^galleries/(A-Z0-9_-]+)/$ ./gallery.php?category=$1 [nc]
RewriteRule ^galleries/(A-Z0-9_-]+)/+([A-Z0-9_-]+)$  ./gallery.php?category=$1&image=$2 [nc]

Теперь проблема в том, что скрипту галереи на самом деле нужны CSS, Javascript и Images, расположенные в http://www.domain.com/somedir/css, http://www.domain.com/somedir/js, и http://www.domain.com/somedir/images соответственно.

Я не хочу жестко кодировать какие-либо абсолютные URL-адреса, поэтому ссылки на CSS, JS и изображения будут использоваться с использованием относительных URL-адресов (./css, ./js, ./images и т. Д.). Поэтому я могу переписать URL следующим образом:

RewriteRule ^galleries/[A-Z0-9_-]+/css/(.*)$ ./css/$1 [nc]

Проблема в том, что, поскольку http://www.domain.com/somedir/galleries/cats является виртуальным каталогом, вышеприведенное работает только в том случае, если пользователь вводит:

http://www.domain.com/somedir/gallaries/cats/

Если пользователь пропустит косую черту, mod_dir не добавит его, потому что на самом деле этот каталог не существует.

Если я добавлю переадресацию перенаправления с абсолютным URL, он будет работать:

RewriteRule ^galleries/([A-Z0-9_-]+)$ http://www.mydomain.com/subdir/galleries/$1/ [R,nc,L]

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

RewriteRule ^galleries/([A-Z0-9_-]+)$ galleries/$1/ [R,nc,L]

Но вместо этого он перенаправляет на:

http://www.mydomain.com/home/myaccount/public_html/subdir/galleries/theRest

что явно не то, что я хочу.

РЕДАКТИРОВАТЬ: Дополнительные пояснения

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

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

Ответы [ 4 ]

4 голосов
/ 20 октября 2011

Вот решение прямо из Документации Apache (в разделе «Проблема с косой чертой»):

RewriteCond    %{REQUEST_FILENAME}  -d
RewriteRule    ^(.+[^/])$           $1/  [R]

Вот решение , которое проверяет REQUEST_URI длязавершающий слеш, затем добавляет его:

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.+) http://www.example.com/$1/ [R=301,L]

Вот другое решение , которое позволяет исключить определенные шаблоны REQUEST_URI:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !example.php
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://domain.com/$1/ [L,R=301]

Надеюсь, что эта помощь.:)

2 голосов
/ 23 октября 2011

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+[^/])$ $1/ [L,R=301]

Редактировать:

Чтобы Apache не мог добавить путь относительно корня документа, вы должны использовать RewriteBase.Так, например, в папку, предназначенную для корня вашего приложения, вы добавляете следующее, которое переопределяет физический путь:

RewriteBase /
1 голос
/ 20 октября 2011

Это может работать:

RewriteRule ^myParentDir/[A-Z0-9_-]+$ %{REQUEST_URI}/ [NS,L,R=301]

Однако я не уверен, почему вы думаете, что это вообще нужно.Просто сделайте так, чтобы правило перезаписи файлов CSS / JS / image выглядело примерно так:

RewriteRule ^galleries/([A-Za-z0-9_-]+/)*(css|js|images)/(.*)$ ./$2/$3

, и все должно работать нормально, независимо от того, запрашивает браузер /somedir/galleries/css/whatever.css или /somedir/galleries/cats/css/whatever.css или даже /somedir/galleries/cats/persian/calico/css/whatever.css.

Ps.Одна из проблем этого правила состоит в том, что оно не позволяет вам иметь имена галерей "css", "js" или "images".Возможно, вы захотите исправить это, назвав эти виртуальные каталоги чем-то вроде «.css», «.js» и «.images», или используя другую схему именования, которая не конфликтует с действительными именами галерей.

0 голосов
/ 14 октября 2011

Я не уверен, что полностью понимаю вашу проблему.

Перенаправление косой черты выполняется автоматически в большинстве случаев установки Apache из-за модуля mod_dir (99% вероятности, что у вас есть модуль mod_dir).

Возможно, вам понадобится добавить:

DirectorySlash On

Но это значение по умолчанию.

Итак.Если вы обращаетесь к foo/bar, а bar - это не файл в каталоге foo, а подкаталог, то mod_dir выполняет перенаправление на foo/bar/.

Единственное, что мне известно, что может сломать это - Option Multiviews, которыйвозможно пытается найти в каталоге bar.php, bar.php, bar.a-mime-extension-knwon-by-apache.Таким образом, вы можете попробовать добавить:

Option -Multiviews

и удалить все rewriteRules.Если вы не получаете такое поведение Apache по умолчанию, вам, возможно, придется посмотреть на переписывание модов, но это все равно, что использовать ядерную бомбу, чтобы убить паука.Ядерные бомбы могут стать довольно обидчивыми, чтобы хорошо их использовать.

РЕДАКТИРОВАТЬ: Для решения проблемы косой черты с перезаписью мода вы можете проверить это документальное руководство , заявив, что это должно работать:

RewriteEngine  on
RewriteBase    /myParentDir/
RewriteCond    %{REQUEST_FILENAME}  -d
RewriteRule    ^(.+[^/])$           $1/  [R]
...