mod_rewrite не добавляет запросы - PullRequest
0 голосов
/ 08 января 2012

У меня есть сайт, на котором я пытаюсь переписать search / ks3 / 7 / example-topic на search.php? Ks = ks3 & year = 7 & topic = example-topic

Я использую apache mod_rewrite и my.htaccess выглядит следующим образом:

RewriteEngine On
RewriteBase /
RewriteRule ^search/(a-zA-Z0-9+)/(a-zA-Z0-9+)/(a-zA-Z0-9-+) search.php?ks=$1&year=$2&topic=$3 [R=301,L]

Однако, когда я просматриваю поиск / ks3 / 7 / example, мои php $ _GET ['ks'], $ _GET ['topic'] и $ _GET ['year'] не содержат данных.

Мой журнал ошибок apache показывает ошибки в PHP "undefined index ks" и т. д.

Мой журнал перезаписи (для которого задано многословие 9) показывает:

192.168.0.171 - - [08/Jan/2012:13:11:46 +0000] [192.168.0.10/sid#7ff3cc9b7460][rid#7ff3c65f90a0/initial] (3) [perdir /data/shared/chemistry/] add path info postfix: /data/shared/chemistry/search.php -> /data/shared/chemistry/search.php/ks3/7/example-topic
192.168.0.171 - - [08/Jan/2012:13:11:46 +0000] [192.168.0.10/sid#7ff3cc9b7460][rid#7ff3c65f90a0/initial] (3) [perdir /data/shared/chemistry/] strip per-dir prefix: /data/shared/chemistry/search.php/ks3/7/example-topic -> search.php/ks3/7/example-topic
192.168.0.171 - - [08/Jan/2012:13:11:46 +0000] [192.168.0.10/sid#7ff3cc9b7460][rid#7ff3c65f90a0/initial] (3) [perdir /data/shared/chemistry/] applying pattern '^search/(a-zA-Z0-9+)/(a-zA-Z0-9+)/(a-zA-Z0-9-+)$' to uri 'search.php/ks3/7/example-topic'
192.168.0.171 - - [08/Jan/2012:13:11:46 +0000] [192.168.0.10/sid#7ff3cc9b7460][rid#7ff3c65f90a0/initial] (1) [perdir /data/shared/chemistry/] pass through /data/shared/chemistry/search.php
192.168.0.171 - - [08/Jan/2012:13:11:46 +0000] [192.168.0.10/sid#7ff3cc9b7460][rid#7ff3c65f00a0/subreq] (1) [perdir /data/shared/chemistry/] pass through /data/shared/chemistry/ks3

и мой файл виртуальных хостов apache выглядит следующим образом

<VirtualHost *:80>
    ServerAdmin powerj96@hotmail.co.uk

    DocumentRoot /data/shared/chemistry
    <Directory /data/shared/chemistry/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
    </Directory>
    <Directory />
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>
</VirtualHost>

Mod_Rewrite определенно работает.Я попробовал правило:

RewriteRule ^google http://www.google.com [R=301,L]

, и это работает.

Я также запускаю 4 других виртуальных хоста на сервере, 3 из которых являются только веб-сайтами, а 1 - веб-интерфейсом передачи.

Я использую Ubuntu Server 11.11

EDIT:

Я думаю, что проблема может быть связана с запуском обратного прокси вместе с этим.например, если обратный прокси-сервер меняет 192.168.0.10:81 (адрес моего сервера и порт 81 vhost) на передачу / сеть, то тот факт, что передача работает на 192.168.0.10/transmission/web, который является одновременно и vhost, иПодкаталог сайта, который работает по адресу 192.168.0.10/ (тот, о котором идет речь в этом посте), может вызывать конфликты в модуле перезаписи.Есть ли у вас какие-либо идеи для решения этой проблемы, если вы считаете, что это может быть проблемой.

РЕДАКТИРОВАТЬ:

Это полный журнал для всего, что происходит, когда я нажимаю ссылку поиска / ks3/ 7 / example-topic

(1) [perdir /data/shared/chemistry/] pass through /data/shared/chemistry/search.php
(3) [perdir /data/shared/chemistry/] add path info postfix: /data/shared/chemistry/search.php -> /data/shared/chemistry/search.php/ks3/7/example-topic
(3) [perdir /data/shared/chemistry/] strip per-dir prefix: /data/shared/chemistry/search.php/ks3/7/example-topic -> search.php/ks3/7/example-topic
(3) [perdir /data/shared/chemistry/] applying pattern '^search/([^/]+)/([^/]+)/([^/]+)' to uri 'search.php/ks3/7/example-topic'
(1) [perdir /data/shared/chemistry/] pass through /data/shared/chemistry/search.php
(1) [perdir /data/shared/chemistry/] pass through /data/shared/chemistry/ks3

EDIT:

Я понял источник проблемы после просмотра этого файла журнала.По какой-то причине apache переписывает search / ks3 / 7 / example-topic в search.php / ks3 / 7 / example-topic, прежде чем применить мое переписывание, поэтому search / ks3 / 7 / example-topic не удовлетворяет

^search/([^/]+)/([^/]+)/([^/]+)

Правило.Я изменил правило на

^search.php/([^/]+)/([^/]+)/([^/]+)

, и это работает.

Есть ли у вас какие-либо идеи о том, как остановить переписывание apache search / ks3 / 7 / example-topic для search.php /ks3 / 7 / example-topic?

Работает сейчас, после удаления опций QSA, NC и R = 301.

1 Ответ

0 голосов
/ 09 января 2012

Ваш переписанный журнал мало что говорит.Удалите информацию об IP в начале (кого это волнует?).И добавьте начало перезаписи (= скажите нам, что такое URI, который будет перезаписан): взгляните на первую строку следующего журнала.

Вот пример того, что должно быть более полезным:


(2) init rewrite engine with requested uri /robots.txt
(3) applying pattern '(.*)setup.php' to uri '/robots.txt'
(3) applying pattern '(.*)admin(.*)' to uri '/robots.txt'
(3) applying pattern '(.*)' to uri '/robots.txt'
(4) RewriteCond: input='www.papdevis.com' pattern='!(papdevis)' [NC] => not-matched
(3) applying pattern '(.*)' to uri '/robots.txt'
(4) RewriteCond: input='www.papdevis.com' pattern='(.*)\.(com|net|org|eu)' [NC] =>     matched
(2) rewrite '/robots.txt' -> 'http://www.papdevis.fr/robots.txt'
(2) explicitly forcing redirect with http://www.papdevis.fr/robots.txt
(1) escaping http://www.papdevis.fr/robots.txt for redirect
(1) redirect to http://www.papdevis.fr/robots.txt [REDIRECT/301]
(2) init rewrite engine with requested uri / 
(3) applying pattern '(.*)setup.php' to uri '/'
(3) applying pattern '(.*)admin(.*)' to uri '/'
(3) applying pattern '(.*)' to uri '/'
(4) RewriteCond: input='www.papdevis.com' pattern='!(papdevis)' [NC] => not-matched
(3) applying pattern '(.*)' to uri '/'
(4) RewriteCond: input='www.papdevis.com' pattern='(.*)\.(com|net|org|eu)' [NC] => matched
(2) rewrite '/' -> 'http://www.papdevis.fr/'
(2) explicitly forcing redirect with http://www.papdevis.fr/
(1) escaping http://www.papdevis.fr/ for redirect
(1) redirect to http://www.papdevis.fr/ [REDIRECT/301]

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

search/ks3/7/example-topic

на

search.php?ks=ks3&year=7&topic=example-topic

И ваш файл .htaccess выглядит так:

RewriteEngine On
RewriteBase /
RewriteRule ^search/(a-zA-Z0-9+)/(a-zA-Z0-9+)/(a-zA-Z0-9-+) \
    search.php?ks=$1&year=$2&topic=$3 [R=301,L]

Это никогда не сработает ... попробуйте это:

RewriteEngine On
RewriteBase /
RewriteRule ^search/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9-]+) \
    search.php?ks=$1&year=$2&topic=$3 [QSA,NC,R=301,L]

... или, может быть, как взять все , но слеш?Это может выглядеть так:

RewriteEngine On
RewriteBase /
RewriteRule ^search/([^/]+)/([^/]+)/([^/]+) \
    search.php?ks=$1&year=$2&topic=$3 [QSA,NC,R=301,L]

Пожалуйста, скажите мне, если это работает.

Два совета:

Если вы не в размещенной среде (=, если этосвой собственный сервер, и вы можете изменять виртуальные хосты, а не только файлы .htaccess, попробуйте использовать директиву RewriteLog: она поможет вам отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярных выражений:

http://www.quanetic.com/Regex (не забудьте выбрать ereg (POSIX) вместо preg (PCRE)!)

...