Выполнение перезаписи 301 из папки с использованием относительных URL перезаписи - PullRequest
3 голосов
/ 26 октября 2010

У меня следующая проблема. Мы использовали много разных URL на одной странице. Теперь мы хотим использовать только один URL для этих страниц. Вот пример:

RewriteRule ^(subfolder1/folder1/|(subfolder2|subfolder3)/folder2/|folder3/)?(name1|name2|name3|name4)$ scriptname.php [QSA,NC]

Как видите, это довольно грязно. Теперь я хочу сделать следующее: переписать все URL-адреса только на один из этих URL-адресов (например, subfolder1 / folder1 / name1), используя 301, а затем переписать этот URL-адрес, чтобы обратиться к реальному сценарию. Это может выглядеть так:

RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /subfolder1/folder1/name1 [R=301,QSA,NC]
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC]

Пока у меня нет проблем. Но теперь наступает сложная часть. Мы используем несколько машин для разработки на машинах UNIX и Windows. Все они имеют разные имена хостов и папки. Вот несколько примеров:

http://www.example.com (production)
http://test.example.com (testing)
http://localhost/development_folder/ (development WIN)
http://localhost:8888/development_folder/ (development MAC)

Проблема в том, что, поскольку у нас есть подпапки на машинах разработки, я не могу использовать абсолютный URL-адрес как /subfolder1/folder1/name1/, как, например, укажите http://localhost/subfolder1/folder1/name1/, а не http://localhost/development_folder/subfolder1/folder1/name1/, поэтому все переписывания будут нарушены на машинах разработки.

Есть ли шанс, что эта проблема заработает? Поскольку папка development_folder одинакова на всех машинах разработки, будет ли она полезна для исключения / включения этой папки в последующие записи, как показано ниже:

RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /development_folder/subfolder1/folder1/name1 [R=301,QSA,NC]
RewriteRule ^development_folder/(.*)$ $1 [QSA.NC]
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC]

Или есть лучший способ сделать это? Любой намек очень поможет.

Ответы [ 3 ]

1 голос
/ 20 ноября 2010

Я бы использовал директивы Apache Include для изменения набора правил.Таким образом, я могу проверить правила, которые будут использоваться в рабочей среде.

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

RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /subfolder1/folder1/name1 [R=301,QSA,NC]
Include /etc/apache/conf.d/*_dev.rewrites
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC]

На ваших машинах dev и ТОЛЬКО на вашей машине dev //ache_conf.d/my_dev.rewrites:

1007 *
0 голосов
/ 19 ноября 2010

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

# dev
RewriteCond %{HTTP_HOST} ^localhost$ [NC]
RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /subfolder1/folder1/name1 [R=301,QSA,NC]
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC]

# production
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /dev_folder/subfolder1/folder1/name1 [R=301,QSA,NC]
RewriteRule ^dev_folder/subfolder1/folder1/name1$ script.php?dev=1 [QSA.NC]

Идея состоит в том, чтобы использовать имя хоста, чтобы иметь другой набор правил. При необходимости вы можете использовать dev1.example.com, dev2.example.com и т. Д., Добавляя эти «поддельные» домены к /etc/hosts как псевдоним 127.0.0.1

0 голосов
/ 18 ноября 2010

Не будет ли работать RewriteRules для каждого каталога (внутри .htaccess)? Затем вы можете указать относительную замену (без / перед) или, в случае необходимости, абсолютную (с /).

При относительном, базовый путь будет удален перед перезаписью, а затем снова добавлен префикс. Возможно, вам нужно настроить RewriteBase для правильной работы (хм, по-разному для разных серверов ...).

...