Я использую RewriteRule, чтобы заменить все пробела (AKA% 20) в моей URL, подчеркивание:Apache: RewriteRule приводит к сегментации
RewriteRule (.*)[\ ](.*) $1_$2 [N]
код [N] флаг начинается процесс перезаписи снова, пока не пространство не левый (надеюсь). Теперь все хорошо, когда есть файл ожидания на другой стороне, то есть запрос:
/This is an example.html
и файл:
This_is_an_example.html
Но когда нет соответствия файла, Apache выходит с 500 Внутренняя ошибка. Журнал ошибок констатирует Segfault и журнал переписывают показывает, что переписывают двигатель сходит с ума, пытаясь не перенаправить
/This is an_example.html/This is an_example.html/This is an_example.html/...
и так далее до Segfault (заметьте, что последний пространство было преобразовано, но ни один еще).
Есть ли у кого-нибудь идея, почему RewriteRule так неудачно не работает, работая над существующими файлами?
Update: выдаёт ошибку сегментации происходит только, если есть дополнительный "/" в запрашиваемом URI, как
/virtual-directory/This is an example.html
Update 2: Там нет нет RewriteCond в этом заявлении. По-моему, это должно работать без. Вопрос в том, почему это не так. Htaccess:
RewriteEngine On
RewriteBase /test/
RewriteRule (.*)[\ ](.*) $1_$2 [N]
Update 3: Файл .htaccess в вопросе:
AddType application/xhtml+xml .xhtml
AddEncoding x-gzip .gz
ExpiresActive On
ExpiresByType application/xhtml+xml "access plus 1 year"
ErrorDocument 404 /test/index.php?error=404
RewriteEngine On
RewriteBase /test/
# replace spaces with underscores
RewriteCond %{REQUEST_FILENAME} .*[\ ].*
RewriteRule (.*)[\ ](.*) $1_$2 [N]
# the index.php
RewriteRule ^index.php - [L]
# language tag
RewriteRule ^([a-z]{2})$ index.php?lang=$1&url= [L,QSA]
RewriteRule ^$ en [R=301,L]
# add .xhtml
RewriteCond %{REQUEST_FILENAME}.xhtml -s [OR]
RewriteCond %{REQUEST_FILENAME}.xhtml.gz -s
RewriteRule ^(.+) $1.xhtml
# add .gz
RewriteCond %{HTTP:Accept-Encoding} .*gzip.*
RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz
# send correct mime type
#RewriteCond %{REQUEST_FILENAME} -s
RewriteRule \.xhtml\.gz$ - [L,T=application/xhtml+xml]
Высказывания RewriteLog слишком велики, чтобы вставить. Один запрос заполняет файл 13 МБ данных. Вот дайджест:
(IP) - - [date] [host] (3) [perdir /htdocs/test/] add path info postfix: /htdocs/test/de -> /htdocs/test/de/This is a test
(IP) - - [date] [host] (3) [perdir /htdocs/test/] strip per-dir prefix: /htdocs/test/de/This is a test -> de/This is a test
(IP) - - [date] [host] (3) [perdir /htdocs/test/] applying pattern '(.*)[\ ](.*)' to uri 'de/This is a test'
(IP) - - [date] [host] (2) [perdir /htdocs/test/] rewrite 'de/This is a test' -> 'de/This is a_test'
(IP) - - [date] [host] (3) [perdir /htdocs/test/] add per-dir prefix: de/This is a_test -> /htdocs/test/de/This is a_test
(IP) - - [date] [host] (3) [perdir /htdocs/test/] add path info postfix: /htdocs/test/de/This is a_test -> /htdocs/test/de/This is a_test/This is a test
(IP) - - [date] [host] (3) [perdir /htdocs/test/] strip per-dir prefix: /htdocs/test/de/This is a_test/This is a test -> de/This is a_test/This is a test
(IP) - - [date] [host] (3) [perdir /htdocs/test/] applying pattern '(.*)[\ ](.*)' to uri 'de/This is a_test/This is a test'
(IP) - - [date] [host] (2) [perdir /htdocs/test/] rewrite 'de/This is a_test/This is a test' -> 'de/This is a_test/This is a_test'
(IP) - - [date] [host] (3) [perdir /htdocs/test/] add per-dir prefix: de/This is a_test/This is a_test -> /htdocs/test/de/This is a_test/This is a_test
(IP) - - [date] [host] (3) [perdir /htdocs/test/] add path info postfix: /htdocs/test/de/This is a_test/This is a_test -> /htdocs/test/de/This is a_test/This is a_test/This is a test
(IP) - - [date] [host] (3) [perdir /htdocs/test/] strip per-dir prefix: /htdocs/test/de/This is a_test/This is a_test/This is a test -> de/This is a_test/This is a_test/This is a test
(IP) - - [date] [host] (3) [perdir /htdocs/test/] applying pattern '(.*)[\ ](.*)' to uri 'de/This is a_test/This is a_test/This is a test'
(IP) - - [date] [host] (2) [perdir /htdocs/test/] rewrite 'de/This is a_test/This is a_test/This is a test' -> 'de/This is a_test/This is a_test/This is a_test'
(IP) - - [date] [host] (3) [perdir /htdocs/test/] add per-dir prefix: de/This is a_test/This is a_test/This is a_test -> /htdocs/test/de/This is a_test/This is a_test/This is a_test
... and so on ad infinitum
Плохой парень - это строка 6: «Добавить информацию о пути postfix».
Как и где определить ваш '/ virtual-directory' (или это'/test')? –
и каков ваш [ErrorDocument] [1], действующий в '/ virtual-directory'? [1]: http://httpd.apache.org/docs/2.0/mod/core.html#errordocument –
Я обновил вопрос соответствующим образом. ErrorDocument определен только для 404s, это перенаправление на index.php в том же каталоге, что и файл .htaccess. «/ Virtual-directory» в действительности использует префикс языка (например, «/ en /» или «/ de /»), который я использую для различения запрошенного языка. – Boldewyn