Правила mod_rewrite и согласование содержимого

Я относительно новичок в mod_rewrite, но у меня есть сайт, на котором я хотел бы иметь "красивые ссылки". Аналогично ТАК:).

Я пытаюсь получить что-то вроде: " http://www.whatever.com/search/test " переписать на " http://www.whatever.com/search.php?q=test " и у меня было несколько ограниченных успех. Я считаю, что переговоры по содержанию мешают мне...

Для начала вот мой тестовый файл.htaccess:

RewriteEngine on
RewriteBase /~user/mysite/

RewriteRule ^search$ search/ [R]
RewriteRule ^search/([^/]*)/?$ search.php?q=$1 [L]

К сожалению, перенаправляет на search.php, но не передает мой параметр в переменной q. Однако это работает:

RewriteEngine on
RewriteBase /~user/mysite/

RewriteRule ^search$ search/ [R]
RewriteRule ^search/([^/]*)/?$ s.php?q=$1 [L] # here i've renamed the search.php to s.php to dodge the content negotiation that is happening..

Фактически, если я удаляю все правила вместе, я получаю тот же результат, что и с первой версией файла. Итак, мой вывод заключается в том, что поскольку apache успешно перенаправляет "foo" на "foo.php" даже без каких-либо правил mod_rewrite, то это должно быть согласование содержимого, которое заботится об этом. (Это подтверждается тем фактом, что если я переименую свой файл foo.php в foo.html, он все равно найдет файл, если я просто перейду к "foo").

Итак, вопрос в том. Как правильно использовать mod_rewrite в отношении согласования контента? Могу ли я отключить его для определенного файла? Есть ли способ обеспечить выполнение моих правил mod_rewrite до согласования содержимого?

Если это уместно, вот файл conf для части mod_userdir моего apache conf (этот тестовый сайт находится в homedir / public_html моего пользователя):

# Settings for user home directories

<IfDefine USERDIR>
<IfModule userdir_module>

# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.  Note that you must also set
# the default access control for these directories, as in the example below.
UserDir public_html

# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
<Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    <Limit GET POST OPTIONS>
        Order allow,deny
        Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS>
        Order deny,allow
        Deny from all
    </LimitExcept>
</Directory>

# Suexec isn't really required to run cgi-scripts, but it's a really good
# idea if you have multiple users serving websites...
<IfDefine SUEXEC>
<IfModule suexec_module>
<Directory /home/*/public_html/cgi-bin>
    Options ExecCGI
    SetHandler cgi-script
</Directory>
</IfModule>
</IfDefine>

</IfModule>
</IfDefine>

1 ответ

Решение

Ищите эту опцию в вашей конфигурации.

Options +Multiviews

Будет искать

/foo/test
/foo/
/foo

и перенаправить их на

/foo.[any file]

на основании того, существует ли он и соответствует ли он запрошенному типу контента.

Измените параметр на это, чтобы отключить это.

Options -Multiviews
Другие вопросы по тегам