Как переписать / foo-bar в foo-bar.html, но / foo / bar в foo-bar.html, используя mod_rewrite? - PullRequest
0 голосов
/ 07 сентября 2010

Как переписать /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 слишком рано.

Есть идеи, как это исправить, и чтовызывая его сбой на этом конкретном сервере?

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

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

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

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

Options -MultiViews
1 голос
/ 07 сентября 2010

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

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

RewriteEngine On</p> <pre><code># 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
...