<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>zodal (zodal)</title>
    <link>https://ruby-china.org/zodal</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>Rails 如何设置全局的 URL 前缀</title>
      <description>&lt;p&gt;想用 nginx 根据 url 前缀转发请求到 rails，所以需要给 rails 加上一个全局的 url 前缀。&lt;/p&gt;

&lt;p&gt;试过修改 config.ru 文件为：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="s1"&gt;'/app'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是这种方法也只是给 controller 的 url 加上了前缀，静态资源没有变化。&lt;/p&gt;

&lt;p&gt;补充=========================&lt;/p&gt;

&lt;p&gt;在官网上找到了这个配置，但是感觉 rails 在这个地方处理的特别矛盾。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;relative_url_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/app"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个配置会在生成链接的时候给链接加上前缀，但这个配置有两个问题：&lt;/p&gt;

&lt;p&gt;1、只会改变静态文件的链接，controller 的链接不受影响。&lt;/p&gt;

&lt;p&gt;2、只是修改生成到网页的链接，而不会修改实际路径。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= link_to image_tag("rails.png", alt: "Rails logo"), 'http://rubyonrails.org/' %&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的代码本来生成的链接是这样的： &lt;code&gt;http://localhost/rails-b8442a7b798faf40f6c42e065d211574e1bb622495453893e625a416404177c2.png&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;加了配置后会变成：&lt;code&gt;http://localhost/app/rails-b8442a7b798faf40f6c42e065d211574e1bb622495453893e625a416404177c2.png&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;但是这个只是改变了生成的 url，并不会改变实际的 url，如果真的需要拿到资源还是需要访问把 app 去掉的 url。&lt;/p&gt;

&lt;p&gt;我想这应该是为了给 nginx 用的，由 nginx 在处理时去掉 app 前缀。&lt;/p&gt;

&lt;p&gt;这样子和最开始的那个修改 config.ru 的方法加在一起后确实勉强能实现了，需要 nginx 配置两个转发规则一个给 controller，直接原样转发，只是改一下域名和端口；一个给静态文件，转发时去掉 app 前缀。虽然这又会导致不通过 nginx 直接访问系统时无法获取静态资源。。。&lt;/p&gt;

&lt;p&gt;虽然这样是能解决问题，但是看着就 tm 的离谱，照理来说第一个方法就因该解决问题了，明明静态资源也是 rails 处理的。从来没在其他语言的 web 框架里见过这种事情。不知道大佬们有没有更好的方案。&lt;/p&gt;</description>
      <author>zodal</author>
      <pubDate>Thu, 03 Sep 2020 16:41:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/40362</link>
      <guid>https://ruby-china.org/topics/40362</guid>
    </item>
  </channel>
</rss>
