2010-09-07 6 views
0

Как переписать /foo-bar на foo-bar.html, но /foo/bar на foo--bar.html с помощью mod_rewrite?Как переписать/foo-bar в foo-bar.html, но/foo/bar в foo-bar.html с помощью mod_rewrite?

Иными словами, замените все косые черты в URI запроса на --, затем добавьте .html.

Я написал следующий код:

RewriteEngine On 
RewriteBase/

# Take care of /foo/bar and /foo-foo/bar-bar 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z0-9-]+)/([a-z0-9-]+)/?$ $1--$2.html [L] 

# Take care of /foo, or /foo-bar-baz-whatever-no-slashes 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z0-9-]+)/?$ $1.html [L] 

Это, кажется, работает на некоторых серверах, но по моему, кажется, запутались в переписывает:

Запрошенный URL /foo.html/bar не был найден на этом сервер.

Похоже, что приложение .html слишком рано.

Любые идеи о том, как исправить это, и что приводит к его сбою на этом конкретном сервере?

ответ

1

Я не уверен, почему ваш пример не работает. Поставка apache vesion, которую вы используете, поможет много. Я был в состоянии воспроизвести проблему с Apache/2.2.14

Если удалить директиву RewriteBase и идти с Apache/2.2.14

RewriteEngine On

# Take care of /foo/bar and /foo-foo/bar-bar 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/([a-z0-9-]+)/([a-z0-9-]+)/?$ /$1--$2.html [L] 

# Take care of /foo, or /foo-bar-baz-whatever-no-slashes 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/([a-z0-9-]+)/?$ /$1.html [L] 

вы должны лучше удачи.

В будущем посмотрите вверх ваш уровень журнала, чтобы упростить отладку того, что происходит.

#don't leave this on in production 
    RewriteLog "/private/var/log/apache2/rewrite.log" 
    RewriteLogLevel 5 
+0

Weird, кажется, работает без 'директивы RewriteBase'. Почему? Благодаря! – Wendy

1

Один случай, когда это, кажется, происходит, когда MultiViews включена, но AcceptPathInfo установлен в Off (или Default и обработчик не принимает данные пути), и foo.html существует.

Apache сообщает, что ваш запрос на /foo/bar не указывает на реальный ресурс и отображает его на /foo.html с информацией о пути /bar. Поскольку информация о пути не разрешена, Apache возвращает 404 для запроса. Аналогично, mod_rewrite не выполняет переписывание, потому что /foo.html теперь является существующим файлом.

Решение этого сценария было бы отключить MultiViews в файле .htaccess:

Options -MultiViews 
Смежные вопросы