<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">If you've got a messy config with no common patterns, you've got a messy<br>
config with no common patterns, and there's not much you can do about it.<br>
<br>
If you can find common patterns, maybe you can make the config more<br>
maintainable (read: no top-level regex locations); but you don't want<br>
to break previously-working urls.<br></blockquote><div><br></div><div>The site was initially using Apache + mod_php. Hence these ere not an issue. It was only when</div><div>I tried to migrate to PHP-FPM, I realized the mistakes. Now the urls cannot be chanced due to </div><div>SEO implications.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<span class=""><br>
> I tried using ^~ as you suggested. Now the rewrite is working correctly,<br>
> but the files are not executed. The request is returning the actual PHP<br>
> source file, not the HTML generated by executing the script.<br>
<br>
</span>Can you show one configuration that leads to the php content being<br>
returned?<br>
<br>
If you rewrite /test/x.php to /test.php, /test.php should be handled in<br>
the "~ php" location.<br></blockquote><div><br></div><div>I am sorry, I did not rewrite it to a location outside /test/, which was why the file content was being returned.</div><div><br></div><div>Is it possible to do something like this?<div><br></div><div><pre style="margin-top:0px;margin-bottom:1em;padding:5px;border:0px;width:auto;max-height:600px;overflow:auto;word-wrap:normal;background-color:rgb(239,240,241)"><font color="#303336" face="Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, sans-serif"><span style="font-size:13px;white-space:pre-wrap">location /test/ {
    rewrite "^/test/([a-z]+).php$" /php-fpm/test/test.php?q=$1 last; 
}

location ~ ^/php-fpm/ {
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^/php-fpm(.+?\.php)(/.*)$;

        fastcgi_pass <a href="http://127.0.0.1:9000/" target="_blank">127.0.0.1:9000</a>;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}</span></font><font color="#393318" face="Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, sans-serif"><span style="font-size:13px;white-space:pre-wrap"><br></span></font></pre></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(48,51,54)"><br></span></code></div><div>What I have tried to do here is rewrite to add a special prefix (/php-fpm) to the rewritten urls. and nest the php location block within it. Then use <span style="font-size:13px;white-space:pre-wrap;color:rgb(48,51,54);font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;background-color:rgb(239,240,241)">fastcgi_split_path_info</span> to create new $fastcgi_script_name without the special prefix. I tried the above code, but it is not working. <span style="font-size:13px;white-space:pre-wrap;color:rgb(48,51,54);font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;background-color:rgb(239,240,241)">fastcgi_split_path_info</span> is not generating $fastcgi_script_name without the /php-fpm prefix.</div></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
An alternative possibility could be to put these rewrites at server<br>
level rather than inside location blocks. That is unlikely to be great<br>
for efficiency; but only you can judge whether it could be adequate.<br>
<span class=""><br>
> > > location ~ [^/]\.php(/|$) {<br>
> > >     fastcgi_split_path_info ^(.+?\.php)(/.*)$;<br>
> > ><br>
> > >     set $fastcgi_script_name_custom $fastcgi_script_name;<br>
> > >     if (!-f $document_root$fastcgi_script_name) {<br>
> > >         set $fastcgi_script_name_custom "/cms/index.php";<br>
> > >     }<br>
> ><br>
> > I suspect that it should be possible to do what you want to do there,<br>
> > with a "try_files". But I do not know the details.<br>
><br>
> There is a CMS engine which will intercept all unmatched requests and check<br>
> the database to see if there is an article with that URI. Some times it has<br>
> to match existing directories without index.php. If I use try_files, it<br>
> will either lead to a 403 error (if no index is specified), or would<br>
> internally redirect the request to the index file (if it is specified),<br>
> leading to 404 error. The if condition correctly handles all the<br>
> non-existing files.<br>
<br>
</span>There is more than one possible try_files configuration; but that does not<br>
matter: if you have a system that works for you, you can keep using it.<br>
<div class=""><div class="h5"><br>
Good luck with it,<br>
<br>
        f<br>
--<br>
Francis Daly        <a href="mailto:francis@daoine.org">francis@daoine.org</a><br>
<br>
_______________________________________________<br>
nginx mailing list<br>
<a href="mailto:nginx@nginx.org">nginx@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx" rel="noreferrer" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx</a><br>
</div></div></blockquote></div><br></div></div>