Apache, mongrel and slash in route variable

Hi,
in my app i’m ussing this route mapping map.connect
“:controller/:action/view/:file” where :file can have another slash
inside (eg. /config/basics/view/some_folder/another_file) . While
accesing this link in FF3 adress panel its shown like
/config/basics/view/some_folder%2Fanother_file. Under mongrel it works
well, but when I connect mongrel to apache it shows “Not Found” error
page.
I’m on windows, apache 2.2, using configuration of vrtual hosts:

<VirtualHost *:80>
ServerName yourdomain.com
DocumentRoot D:/myapp/public
<Directory “D:/myapp/public”>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

Configure mongrel instances

<Proxy balancer://mongrel_cluster>
BalancerMember http://127.0.0.1:4001
BalancerMember http://127.0.0.1:4002
BalancerMember http://127.0.0.1:4003
BalancerMember http://127.0.0.1:4004
BalancerMember http://127.0.0.1:4005

RewriteEngine On

Uncomment for rewrite debugging

#RewriteLog logs/your_app_deflate_log deflate
#RewriteLogLevel 9

Check for maintenance file and redirect all requests

RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ /system/maintenance.html [L]

Rewrite index to check for static

RewriteRule ^/$ /index.html [QSA]

Rewrite to check for Rails cached page

RewriteRule ^([^.]+)$ $1.html [QSA]

Redirect all non-static requests to cluster

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L]

Deflate

AddOutputFilterByType DEFLATE text/html text/plain text/xml
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

Uncomment for deflate debugging

#DeflateFilterNote Input input_info
#DeflateFilterNote Output output_info
#DeflateFilterNote Ratio ratio_info
#LogFormat ‘“%r” %{output_info}n/%{input_info}n (%{ratio_info}n%%)’
deflate
#CustomLog logs/your_app_deflate_log deflate
ErrorLog logs/your_app_error_log
CustomLog logs/your_access_log combined

I’ve just followed some tutorials with this configuration and in fact I
really don’t know what I was doing there, so any help with that will be
great. :slight_smile: I think I need to add some rule for mod_rewrite, but for now
I really know nothing about it.
Is there any chance to get it working, or only way to do it is to
rewrite my app to not using slashes in route variables?

thanks

You need to configure Apache to allow encoded slashes. By default, it
does not allow them.

http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes


Doug Barth

wow. Thank you very much, but I’m affraid it isn’t that simple… I’ve
added it to my virtualhosts configuration:

<VirtualHost *:80>
AllowEncodedSlashes On
ServerName yourdomain.com
.
.
.

and now it shows Rails 404 instead of Apache 404…

Any ideas?

Doug Barth wrote:

You need to configure Apache to allow encoded slashes. By default, it
does not allow them.

core - Apache HTTP Server Version 2.2


Doug Barth

What error are you getting in your Rails log file? If it’s a routing
error, you may need to specify that the :file portion of your route
can contain pretty much anything.

map.connect “:controller/:action/view/:file”, :requirements =>
{:file => /.*/}


Doug Barth

Yop that was true. :slight_smile:

This add screwed up this route
map.connect “:controller/:action/edit/:file/:id”,
:mode => “edit”,
:requirements => {:file => /.*/},
:file => nil,
:id => nil

But splitting it to
map.connect “:controller/:action/edit/:id/:file”,
:mode => “edit”,
:requirements => {:file => /./, :id => /\d+/},
:file => nil
map.connect “:controller/:action/edit/:file”,
:mode => “edit”,
:requirements => {:file => /.
/},
:file => nil

has done the work, and now everything seems to work well.

Once again, thank you very much for fast help.

Doug Barth wrote:

What error are you getting in your Rails log file? If it’s a routing
error, you may need to specify that the :file portion of your route
can contain pretty much anything.

map.connect “:controller/:action/view/:file”, :requirements =>
{:file => /.*/}


Doug Barth