<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vitas Civilis</title>
    <description>The latest articles on DEV Community by Vitas Civilis (@cvl).</description>
    <link>https://dev.to/cvl</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4130066%2F1c2e39c9-a678-4c17-b536-bb782390d899.jpg</url>
      <title>DEV Community: Vitas Civilis</title>
      <link>https://dev.to/cvl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cvl"/>
    <language>en</language>
    <item>
      <title>Check a site's response from different countries with Shellroute</title>
      <dc:creator>Vitas Civilis</dc:creator>
      <pubDate>Thu, 17 Sep 2026 14:34:04 +0000</pubDate>
      <link>https://dev.to/cvl/check-a-sites-response-from-different-countries-with-shellroute-4c65</link>
      <guid>https://dev.to/cvl/check-a-sites-response-from-different-countries-with-shellroute-4c65</guid>
      <description>&lt;p&gt;Sometimes "works on my machine" really means "works from my country." A site might choose a different language or redirect visitors to a different page based on where their connection comes from. To investigate, you need to send your request from somewhere else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shellroute.com/docs/quickstart?utm_source=dev_to&amp;amp;utm_medium=article&amp;amp;utm_campaign=proxied_shell_tutorial&amp;amp;test_id=dev-proxied-shell-v1" rel="noopener noreferrer"&gt;Shellroute&lt;/a&gt; gives each shell its own proxy IP. Pick a country and use the terminal normally. Your commands still run on your machine; clients such as curl send their requests through that country's proxy IP.&lt;/p&gt;

&lt;p&gt;Let's try a concrete example: Google Store redirects the same URL to different language settings. We'll run one short command on our normal connection, through the US, and through Germany, then compare the redirect addresses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk64nk5f2d5rb6ktlslev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk64nk5f2d5rb6ktlslev.png" alt="Three terminals running the same Google Store redirect check: normal connection returns hl=lt, US returns hl=en-US, and Germany returns hl=de." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recorded on 17 September 2026 with Shellroute v0.1.4. These are the actual responses from that run, not guaranteed results for every connection.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/i8uMtcDCwG0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Check the redirect on your normal connection
&lt;/h2&gt;

&lt;p&gt;Use a macOS or Linux terminal with curl installed. We'll install Shellroute when we open the first routed terminal.&lt;/p&gt;

&lt;p&gt;In your normal terminal, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSI&lt;/span&gt; https://store.google.com/ | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'^location:'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command shows just the redirect address, not a page full of HTML. In our recording, the normal connection returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location: https://store.google.com/?hl=lt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-I&lt;/code&gt; asks for headers only, using a HEAD request. &lt;code&gt;-sS&lt;/code&gt; hides the progress meter but keeps errors visible. The pipe passes the headers to &lt;code&gt;grep&lt;/code&gt;, which keeps the &lt;code&gt;Location&lt;/code&gt; line.&lt;/p&gt;

&lt;p&gt;Don't add &lt;code&gt;-L&lt;/code&gt;: that would follow the redirect instead of stopping at the first response. If no line appears, run &lt;code&gt;curl -sSI https://store.google.com/&lt;/code&gt; without the filter to see the full headers and status. Your normal connection may return a different language setting.&lt;/p&gt;

&lt;p&gt;Keep this terminal open so you can compare its result with the routed requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Run the request through the US
&lt;/h2&gt;

&lt;p&gt;Open another terminal. Install Shellroute with npm and log in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; shellroute
shellroute login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter your email and the code sent to it. A successful new login opens an interactive Shellroute session. If you're already logged in, run &lt;code&gt;shellroute&lt;/code&gt; to open one. Other installation options are in the &lt;a href="https://shellroute.com/docs/quickstart?utm_source=dev_to&amp;amp;utm_medium=article&amp;amp;utm_campaign=proxied_shell_tutorial&amp;amp;test_id=dev-proxied-shell-v1" rel="noopener noreferrer"&gt;quickstart&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Inside that session, select the US:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/connect US
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the connection succeeds, run the same command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSI&lt;/span&gt; https://store.google.com/ | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'^location:'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the recording, this returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location: https://store.google.com/?hl=en-US
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep this terminal open to test other pages or repeat the request through the US.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Repeat from Germany
&lt;/h2&gt;

&lt;p&gt;Open a third terminal and start Shellroute using your saved login:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shellroute
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside it, connect to Germany:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/connect DE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the connection succeeds, rerun your request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSI&lt;/span&gt; https://store.google.com/ | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'^location:'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our German connection returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location: https://store.google.com/?hl=de
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The US shell gives you a second routed comparison. A difference on only one route is a different lead from both proxy routes behaving differently from the normal connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Compare what the application returns
&lt;/h2&gt;

&lt;p&gt;We sent the same request in every terminal. In this run, the redirect's language setting changed with the connection:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Connection&lt;/th&gt;
&lt;th&gt;Redirect language setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Normal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hl=lt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hl=en-US&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hl=de&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That shows a real response difference worth investigating. It doesn't tell us exactly how Google chose each destination, or what the full page would display. We checked redirect headers with HEAD, not a complete browser visit.&lt;/p&gt;

&lt;p&gt;To investigate your own site, replace the Google Store URL with the page a customer reported. Run the same command in each terminal.&lt;/p&gt;

&lt;p&gt;For example, suppose a German customer says your checkout opens in English. You expect &lt;code&gt;/checkout&lt;/code&gt; to redirect to &lt;code&gt;/de/checkout&lt;/code&gt;, but the German terminal shows &lt;code&gt;/en/checkout&lt;/code&gt;. You now have a request that reproduces the wrong redirect. Note when you ran it, find that request in your site's server logs, and check which redirect rule chose the English page. Did the site identify the connection as German? Did a language setting override that choice?&lt;/p&gt;

&lt;p&gt;If the simple requests don't show the customer's problem, country may not be the only difference. Your site might remember a language the customer selected earlier. Use a test account with that language selected, then copy its browser request as described below. Run that identical request through the US and Germany. Next, change only the language selection and repeat. Keeping the URL and account the same helps you distinguish the effect of the connection from the saved preference.&lt;/p&gt;

&lt;p&gt;When finished, type &lt;code&gt;/exit&lt;/code&gt; in each Shellroute session to end its route and return to your normal shell. &lt;code&gt;/disconnect&lt;/code&gt; ends the route but keeps the Shellroute session open.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce a full page or API request
&lt;/h2&gt;

&lt;p&gt;HEAD is useful for this short redirect check, but a site can handle it differently from GET. To fetch a page and inspect its headers and body, use lowercase &lt;code&gt;-i&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'https://YOUR_APP.example/checkout'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the placeholder with your authorized endpoint and use the same command in each routed shell. With HTTPS through a proxy, curl may also print &lt;code&gt;200 Connection established&lt;/code&gt;. That's the proxy handshake, not your application's status; inspect the response that follows it.&lt;/p&gt;

&lt;p&gt;For an existing browser request, don't reconstruct it by hand. In the browser's developer tools, select &lt;strong&gt;Network&lt;/strong&gt;, reload the page, then right-click the relevant request and choose &lt;strong&gt;Copy → Copy as cURL&lt;/strong&gt;. Keep its method, headers, and body unchanged across routes. Add &lt;code&gt;-i&lt;/code&gt; to inspect response headers and remove &lt;code&gt;-L&lt;/code&gt; if you want to examine the first redirect. &lt;a href="https://developer.chrome.com/docs/devtools/network/reference/#copy" rel="noopener noreferrer"&gt;Chrome documents this workflow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Copied requests can contain cookies or credentials. Use a test account, inspect the command, and don't share those values or private responses publicly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Just need one request?
&lt;/h2&gt;

&lt;p&gt;Once you're logged in, you can skip the interactive session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;shellroute run DE &lt;span class="nt"&gt;--&lt;/span&gt; curl &lt;span class="nt"&gt;-sSI&lt;/span&gt; https://store.google.com/ | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'^location:'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shellroute connects, runs curl through Germany, then closes the session. The local &lt;code&gt;grep&lt;/code&gt; simply filters curl's output. Shellroute prints a session summary to stderr; add &lt;code&gt;--no-stat&lt;/code&gt; before &lt;code&gt;DE&lt;/code&gt; if you don't want that summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Shellroute starts a local proxy and sets proxy environment variables for the shell or command it launches. Curl honors those settings. Other terminals keep their existing connection.&lt;/p&gt;

&lt;p&gt;It isn't a system-wide VPN: tools that ignore proxy settings need their own configuration, and it doesn't route arbitrary TCP or UDP traffic. See the &lt;a href="https://shellroute.com/docs/compatibility" rel="noopener noreferrer"&gt;compatibility guide&lt;/a&gt; before using a different client.&lt;/p&gt;

&lt;p&gt;You can now rerun a real request from different countries without reconfiguring each command. Keep the shells open for an investigation, or use &lt;code&gt;shellroute run&lt;/code&gt; for a single check.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shellroute.com/docs/quickstart?utm_source=dev_to&amp;amp;utm_medium=article&amp;amp;utm_campaign=proxied_shell_tutorial&amp;amp;test_id=dev-proxied-shell-v1" rel="noopener noreferrer"&gt;Open your first routed shell with the quickstart&lt;/a&gt;. The CLI is &lt;a href="https://github.com/shellroute/shellroute-cli" rel="noopener noreferrer"&gt;open source on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Disclosure: I built Shellroute and operate the service the CLI connects to.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>terminal</category>
      <category>networking</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
