我希望我的nginx make显示所有网址都干净。
通过一些研究,我已经开始研究第一个案例了。它通过以下配置完成:
location / {
root html;
index index.html index.htm index.php;
try_files $uri.html $uri/ =404;
}
它适用于indexhtml.html显示为indexhtml,但.php没有任何反应。如果我将$ uri.html更改为$ uri.php,它既不适用于.html,也不适用于.php。我试图在php位置添加类似的东西,但没有任何成功。
有任何建议吗?
答案 0 :(得分:42)
无需额外的块和命名位置以及所有内容。同时移动index
行outside the location block
server {
index index.html index.php;
location / {
try_files $uri $uri/ $uri.html $uri.php$is_args$query_string;
}
location ~ \.php$ {
try_files $uri =404;
# add fastcgi_pass line here, depending if you use socket or port
}
}
请注意,如果您在同一文件夹中有一个文件夹和同名文件,例如/folder/xyz/
和/folder/xyz.php
,则无法运行该文件夹中的php文件xyz
包含index.php
或index.html
,请记住这一点。
答案 1 :(得分:41)
根据我的研究,如果你附加你的/etc/nginx/conf.d/domain.tld.conf文件包括:
location / {
try_files $uri $uri.html $uri/ @extensionless-php;
index index.html index.htm index.php;
}
location ~ \.php$ {
try_files $uri =404;
}
location @extensionless-php {
rewrite ^(.*)$ $1.php last;
}
然后重新启动nginx并试一试。希望这会对你有所帮助!可以找到更多信息(我在哪里找到它)here @ tweaktalk.net
答案 2 :(得分:8)
要进一步Mohammad's answer,您可能还希望提供从.html
和.php
到无扩展版本的重定向。
这是可以实现的,因为$request_uri
包含"完整的原始请求URI(带参数)",并且不受用户不可见的内部重写的影响
server {
index index.html index.php;
location / {
if ($request_uri ~ ^/(.*)\.html$) { return 302 /$1; }
try_files $uri $uri/ $uri.html $uri.php?$args;
}
location ~ \.php$ {
if ($request_uri ~ ^/([^?]*)\.php($|\?)) { return 302 /$1?$args; }
try_files $uri =404;
# add fastcgi_pass line here, depending if you use socket or port
}
}
答案 3 :(得分:1)
也许这可能对你有用......它很简单并完成工作:
location / {
rewrite ^/([^\.]+)$ /$1.html break;
}