Apache mod_rewrite приходит в бешенство - перенаправление туда, куда не следует - PullRequest
1 голос
/ 13 сентября 2009

У меня есть скрипт, который отображает перенаправление мета на страницу account_management.php5, но по какой-то причине он автоматически перенаправляет оттуда в index.php5. Мой файл .htaccess обрабатывает несколько переадресаций автоматически, например index.html | php5, в корневой каталог домена, и это единственное место, где я вижу эту проблему, но я не понимаю, почему Это мой файл .htaccess:

RewriteEngine On

#remember to change this to aromaclear
RewriteCond %{HTTP_HOST} !^sinaesthesia\.co.uk$ [NC]
RewriteRule ^(.*)$ http://sinaesthesia.co.uk/$1 [R=301,L]

RewriteCond %{THE_REQUEST} ^GET\ .*/index\.(php5|html)\ HTTP
RewriteRule ^(.*)index\.(php5|html)$ /$1 [R=301,L]

#translate any .html ending into .php5
RewriteRule ^(.*)\.html$ /$1\.php5

#change / for ?
RewriteRule ^(.*)\.html/(.*)$ /$1\.html?$2

#strip .html from search res page
RewriteRule ^(.*)search/(.*)$ /$1search_results\.html/search=$2

#translate product details link from search res page
RewriteRule ^products/(.*)/(.*)/(.*)$ /product_details.php5?category=$1&title=$2&id=$3 [L]

#Translate products/psorisis/chamomile-skin-cream-P[x] to productview.php5?id=1
RewriteRule ^products/.*-P([0-9]+) /productview.php5?id=$1 [L]

Ответы [ 2 ]

1 голос
/ 13 сентября 2009

Неправильно:

RewriteRule ^(.*)\.html$ /$1\.php5

Справа:

RewriteRule ^(.*)\.html$ /$1.php5

правее:

RewriteRule ^(.*)\.html$ /$1.php5 [QSA]

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

Никогда не сравнивайте с %{THE_REQUEST}, это странная вещь, вам это не нужно. Более того, это условие прекрасно без него. Просто положите туда:

RewriteRule ^(.*)index\.(php5|html)$ $1 [R=301,QSA,L]

Теперь посмотрите на это:

RewriteRule ^(.*)\.html/(.*)$ /$1.html?$2

Во-первых, вы все еще принимаете, что есть ссылки на файлы .html, просто после попытки перевести все .html в .php5 здесь что-то не так.
Более того, вы определяете как QueryString что-то, что изначально было путем к файлу, и даже не помещаете его в ключ. Это не сработает, нужно больше лечения.

#strip .html from search res page
RewriteRule ^(.*)search/(.*)$ /$1search_results.html/search=$2

Разве это не должно было раздеть .html? Потому что на самом деле помещает туда .html. Возможно, поскольку это не [L], это исправлено в следующем цикле, но вы можете просто исправить все прямо здесь.

#translate product details link from search res page
RewriteRule ^products/(.*)/(.*)/(.*)$ /product_details.php5?category=$1&title=$2&id=$3 [L]

Этот полный. * Потенциально нестабилен, особенно ограничивая конец. Вы должны сделать это:

RewriteRule ^products/([^/]*)/([^/]*)/([^/]*) /product_details.php5?category=$1&title=$2&id=$3 [L]
# or:
RewriteRule ^products/(.*?)/(.*?)/([^/]*) /product_details.php5?category=$1&title=$2&id=$3 [L]

Последний выглядит правильно, за исключением того, что вы должны убрать специальный символ, который может рассматриваться как разделитель диапазона, - "-". Я не думаю, что это работает после *, но просто чтобы быть уверенным и исправить синтаксис:

RewriteRule ^products/.*\-P([0-9]+) /productview.php5?id=$1 [L]
1 голос
/ 13 сентября 2009

Добавьте это сразу после RewriteEngine on

RewriteLogLevel 9
RewriteLog /tmp/rw.log

Затем перезапустите веб-сервер. Это должно помочь вам отладить проблему.

<ч /> Редактировать: Извините, я не заметил .htaccess выше. Это будет работать только из основного файла конфигурации apache.

...