我想将 nginx 中 URI 的一部分放入变量中。目前我有这条规则。
if ( !-e /tmp/access_22092012_$cookie_PHPSESSID.tmp ) {
rewrite /folder1/folder2/(.*) /folder1/folder1.php?file=$1 last;
}
Run Code Online (Sandbox Code Playgroud)
请求就像
http://my.domain/folder1/folder2/22092012/index.html
http://my.domain/folder1/folder2/22092012/files/x.sfw
其中22092012也可以有其他数字。
我想22092012从 URL 中提取部分并将其放入变量中,然后文件中的内容存在上面的条件:
if ( !-e /tmp/access_$urlpart_$cookie_PHPSESSID.tmp ) {
rewrite /folder1/folder2/(.*) /folder1/folder1.php?file=$1 last;
}
Run Code Online (Sandbox Code Playgroud)
为什么我需要这个:我设置了登录保护来通过会话登录来保护文件。我的应用程序写入 tmp 文件,因此如果文件夹中有 100 个文件,则脚本不需要验证每个文件是否具有权限,也不需要为每个文件运行 php 工作程序。
这可能吗?
我一直在尝试在一个位置提供多个目录,以便所有文件都可以在 /sys/assets/--FILE-- 上访问,无论文件在以下文件夹中的物理位置如何
location /sys {
alias /var/www/website_api/sys/public;
try_files $uri $uri/ /sys/index.php$is_args$args;
location ~ \.php {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(.*)$;
include /etc/nginx/fastcgi_params;
}
location /sys/assets {
alias /var/www/website_api/sys/app/assets/javascripts/;
}
location /sys/assets {
alias /var/www/website_api/sys/app/assets/stylesheets/;
}
location /sys/assets {
alias /var/www/website_api/sys/app/assets/images/;
}
}
Run Code Online (Sandbox Code Playgroud)
目标:
/sys/assets/javascriptFile.js
/sys/assets/stylesheetFile.css
/sys/assets/image.png
Run Code Online (Sandbox Code Playgroud) 我在将 .htaccess 文件转换为 nginx 时遇到问题。我有 3 个 .htaccess 文件。第一个 .htaccess 文件位于文档根目录中,如下所示:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^img-(.*)\.html img.php?id=$1 [L]
RewriteRule ^slide-(.*)\.html slider.php?id=$1 [L]
RewriteRule ^page-(.*)\.html page.php?name=$1 [L]
RewriteRule ^contact\.html$ contact.php [QSA,L,NC]
Run Code Online (Sandbox Code Playgroud)
第二个 .htaccess 文件位于名为 upload 的文件夹中:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?foo\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ nohotlink.gif [L]
<Files ~ "\.(php|sql|php3|php4|phtml|pl|py|jsp|asp|htm|shtml|sh|cgi)$">
order allow,deny
deny from all
</Files>
Run Code Online (Sandbox Code Playgroud)
第三个也是最后一个 .htaccess 文件位于名为“small”的上传文件夹的子目录中:
RewriteEngine Off
Run Code Online (Sandbox Code Playgroud)
现在我在 /etc/nginx 中创建了一个文件夹,名为 includes 并使用这些重写规则制作了 3 个单独的 .access 文件:
对于位于文档根目录中的第一个 .htaccess 文件,我在 /etc/nginx/includes 中创建了一个名为 root.access 的文件。在这个文件中,我有:
# …Run Code Online (Sandbox Code Playgroud) 例如,“å”可以编码为 /%E5 和 /%C3%A5 (utf-8)。我所有的文件名都是 UTF-8,所以 ASCII 变体返回 404。我希望这两个变体都能工作。
我尝试使用以下配置的变体将不正确的 URL 重写为正确的编码。我无法真正匹配这些位置,所以没有到达任何地方。
rewrite ^/%E5$ /%C3%A permanent;
rewrite ^/%25E5$ /%25C3%25A permanent;
location = /%E5 { return 301 /%C3%A; }
Run Code Online (Sandbox Code Playgroud)
我应该如何匹配这些百分比编码的位置?
Ubuntu 14.04 Apache 2.4.18
我已经使用 letencrypt 设置了 SSL 证书。它运行良好,但为了工作,我不能在一个虚拟主机配置文件中定义多个虚拟主机。每个虚拟主机都必须位于 /etc/apache2/sites-available 内的自己的 .conf 文件中。
我需要确保对 www.example.com 的所有请求都重定向到 example.com。由于我需要在唯一的虚拟主机文件中解决它,我试图在里面包含一个重写规则来执行重定向,但到目前为止它无声地失败了:所有https://www.example.com请求都没有被重定向到https ://example.com并显示“不安全的网站”警告。
这是 domain.com-le-ssl.conf 的虚拟主机配置文件。
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
DocumentRoot /home/user_account/www/example.com/public
<Directory /home/user_account/www/example.com/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/home/user_account/www/example.com/public/$1
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Run Code Online (Sandbox Code Playgroud) 我在网上查看了许多其他问题和参考资料 - 根据我的所有计算,我的设置应该有效,但事实并非如此。
我使用 php-fpm 安装了 nginx。如果我尝试访问 .php 文件,它会正确运行并得到正确的结果。我在我的配置文件中得到了这个:
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想设置我的网络应用程序,以便在仍显示在浏览器地址栏中的同时/somedir/file自动执行。所以我修改了我的配置以包含以下内容:/somdir/file.php/somdir/file
location / {
try_files $uri $uri/ $uri.php?query_string
}
Run Code Online (Sandbox Code Playgroud)
这类型的作品,那就是服务器做访问的PHP文件。然而,它没有使用location ~ \.php$上面现有的块来执行它,而是简单地将 php 源代码作为下载到浏览器中。如果我将 .php 手动附加到请求的 URL,则执行 php。
感觉好像一旦服务器匹配try_files到$uri.php,它就不会在位置上再执行一次以查看它需要对 php 文件做什么。我尝试将 php 块放在 的上方和下方location /,但没有任何区别。
我怎样才能让php被执行?
我有一个 Nginx 配置,用于新的 PHP 应用程序,该应用程序具有与另一个旧 PHP 应用程序相同的功能,但 URL 不同。
我想保留旧的应用程序的路径,取代了/foo与路径前缀/page和更换特殊的路径/foo/bar有/page/otherBar:
# legacy support
location ~ ^/foo/bar {
rewrite /foo/bar /page/otherBar$1 last;
}
# How to rewrite all other pages starting with "/foo" ?
# END legacy support
location / {
# try to serve file directly, fallback to front controller
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
proxy_read_timeout 300;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED …Run Code Online (Sandbox Code Playgroud) 我www.example.com/advice/现在有以下网址注意到网址末尾的斜杠了吗?我希望将其删除为类似www.example.com/advice. 现在,当我在浏览器中输入该 URL 时,我会被重定向到带有尾部斜杠的 URL,例如使用 curl 也是如此。现在我知道尾部斜杠被添加了,因为建议是一个实际的目录。
[steve@dev dev.www.example.com]$ curl -I https://dev.www.example.com/advice -k
HTTP/1.1 301 Moved Permanently
Date: Fri, 25 Nov 2016 08:20:11 GMT
Server: Apache/2.4.6 (CentOS)
Location: https://dev.www.example.com/advice/
Cache-Control: max-age=0
Expires: Fri, 25 Nov 2016 08:20:11 GMT
Connection: close
Content-Type: text/html; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)
[steve@dev dev.www.example.com]$ curl -I https://dev.www.example.com/advice/ -k
HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 08:21:19 GMT
Server: Apache/2.4.6 (CentOS)
X-Powered-By: PHP/5.6.27
Set-Cookie: flarum_session=mfbou2hcbvcobhncnaqlvl9bm7; Path=/; HttpOnly
X-CSRF-Token: WV69M1oi8POqOcXi6MvwKhbJQ72Tmo2WpFn3oxwq
Content-Length: 10339
Cache-Control: max-age=0
Expires: Fri, …Run Code Online (Sandbox Code Playgroud) 我有两台具有相同 URL 的服务器,但端口号可能会更改。
我想重定向这两个 URL HTTPS。
如果我输入我的第一个 URL ( http://example.com) 那么我希望它会重定向到https://example.com.
如果我输入第二个 URL ( http://example.com:8080) 然后我希望它重定向到https://example.com:8080.
查看我的配置:
frontend www-HTTP
bind *:80
bind *:443 ssl crt /etc/apache2/ssl/apache.pem
reqadd X-Forwarded-Proto:\ https
default_backend tcp-backend
mode tcp
frontend TCP-HTTP
bind *:8080
bind *:8443 ssl crt /etc/apache2/ssl/paritech.pem
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
mode tcp
backend www-backend
redirect scheme https if !{ ssl_fc }
server dev.example.com 192.168.1.120:8080 check
backend TCP-backend
redirect scheme https if !{ ssl_fc }
server qa.example.com 192.168.1.120:80 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 ARR 和 urlrewrite 部署 jetty servlet 来创建反向代理。如果我启用“在响应标头中反向重写主机”,那么一切似乎都工作正常。我通过 www.example.com/servlet 访问 servlet,该地址在浏览器中保持不变,但通过 localhost:8080 访问 servlet。
问题是该 servlet 根据 get 参数返回 302 重定向。例如,如果我访问 www.example.com/servlet?input=cleaning 那么我将得到一个 302 重定向,该重定向可能会访问 www.cleaningexample.com/howtoclean。反向重写主机规则意味着客户端不会看到此 url,而是返回 www.example.com/howtoclean。
我无法设置静态出站规则,因为我事先不知道 302 重定向可能返回哪个地址。
如果我禁用反向重写主机,则浏览器中的 URL 将从 www.example.com/servlet 更改为 localhost:8080/servlet。
我尝试替换出站规则中的主机,但找不到任何地方可以获取 servlet 返回的原始位置标头,以替换重写的位置主机。
有没有办法让它正常工作?
rewrite ×10
nginx ×6
.htaccess ×2
apache-2.4 ×1
apache2 ×1
arr ×1
haproxy ×1
iis ×1
lets-encrypt ×1
mod-rewrite ×1
php ×1
php-fpm ×1
rewritecond ×1
url ×1
utf-8 ×1