私はすべてのURLの終わりに「/」を取得しようとします:
example.com/art
すべき
example.com/art/
Webサーバーとしてnginxを使用します。
これには書き換えルールが必要です。
よりよく理解するには、これを確認してください:
http://3much.schnickschnack.info/art/projekte
大きな画像の下にある小さなサムネイルを押すと、リロードされ、このURLが表示されます。
http://3much.schnickschnack.info/art/projekte/#
すべてのURLに(最後に)スラッシュがある場合、サイトをリロードしなくても機能します。
現在、nginx-http.confにこの設定があります:
server {
listen *:80;
server_name 3much.schnickschnack.info;
access_log /data/plone/deamon/var/log/main-plone-access.log;
rewrite ^/(.*)$ /VirtualHostBase/http/3much.schnickschnack.info:80/2much/VirtualHostRoot/$1 last;
location / {
proxy_pass http://cache;
}
}
スラッシュを追加するためにnginxを設定するにはどうすればよいですか? (ルールを書き換える必要があると思いますか?)
おそらく、あなたはこのようなものが欲しいと思うでしょう:
rewrite ^([^.]*[^/])$ $1/ permanent;
正規表現は、「「。」なしですべてのURIを書き換えます。 URIの最後に「/」が付いていないもの、または「/」で終わるか、単に「URIにピリオドがなく、スラッシュで終わっていない場合は、最後にスラッシュを追加します」
URIをドットなしで書き換える理由は、ファイル拡張子を持つファイルが書き換えられないようにするためです。たとえば、画像、CSS、javascriptなど、独自の書き換えも行うPHPフレームワークを使用している場合、リダイレクトループの可能性を防ぎます
これに伴う一般的な書き直しは次のとおりです。
rewrite ^([^.]*)$ /index.php;
これは、ピリオドを含まないすべてのURIをindex.php(またはコントローラーを実行するファイル)に非常に単純に書き換えます。
rewrite ^([^.\?]*[^/])$ $1/ permanent;
残りのURLのクエリ文字列が/でタグ付けされるのを避けるため。
例えば.
/ myrest/do?d = 12345
Nginxの場合:
rewrite ^(.*[^/])$ $1/ permanent;
奇妙なことに、これはGoogleでの最初の結果ですが、満足のいく答えはありません。私が知っているこれを行うには2つの良い方法があります。 1つ目は、要求がファイルにヒットするかどうかを直接チェックし、そうでない場合にのみ書き換え条件を適用することです。例えば。
server {
# ...
if (!-f $request_filename) {
rewrite [^/]$ $uri/ permanent;
}
location / {
# CMS logic, e.g. try_files $uri $uri /index.php$request_uri;
}
# ...
}
2番目は、多くの人がifの使用を避けたいので、100%必要ではないので、try_filesを使用して、ヒットしないときに名前付きロケーションブロックにリクエストを送信することです。ファイル。例えば。
server {
# ...
location / {
try_files $uri $uri/ @cms;
}
location @cms {
rewrite [^/]$ $uri/ permanent;
# CMS logic, e.g. rewrite ^ /index.php$request_uri;
}
# ...
}
server {
# ... omissis ...
# put this before your locations
rewrite ^(/.*[^/])$ $1/ permanent;
# ... omissis ...
}
何らかの種類のリクエスト(たとえばGET
リクエスト以外)がこれを行うのを防ぎたい場合(通常はPOST
リクエストについてです。rewrite
はリクエストメソッドをGET
は、サイトの動的機能の一部を破壊する可能性があります)、if
句を追加します。
server {
# ... omissis ...
# put this before your locations
if ($request_method = "GET" ) {
rewrite ^(/.*[^/])$ $1/ permanent;
}
# ... omissis ...
}
rewrite
をlocation
ブロックに入れて(if
も)、より具体的にすることもできます。
wordpressでanthonysomersetからの書き換えを使用して、再循環ループのために/ wp-adminダッシュボードにアクセスする問題を実験しました。しかし、上記の条件を使用してこの問題を解決します:
if ($request_uri !~ "^/wp-admin")
{
rewrite ^([^.]*[^/])$ $1/ permanent;
rewrite ^([^.]*)$ /index.php;
}
遅すぎますが、ソリューションを共有したいので、末尾のスラッシュとnginxの問題に遭遇しました。
#case :
# 1. abc.com/xyz => abc.com/xyz/
# 2. abc.com/xyz/ => abc.com/xyz/
# 3. abc.com/xyz?123&how=towork => abc.com/xyz/?123&how=towork
# 4. abc.com/xyz/?123&ho=towork => abc.com/xyz/?123&how=towork
これが私の解決策です
server {
....
# check if request isn't static file
if ($request_filename !~* .(gif|html|jpe?g|png|json|ico|js|css|flv|swf|pdf|xml)$ ) {
rewrite (^[^?]+[^/?])([^/]*)$ $1/$2 permanent;
}
....
location / {
....
}
}
Httpsでプロキシの背後にあるnginxの場合、このスニペットは$scheme
の正しいリダイレクトを行います
map $http_x_forwarded_proto $upstream_scheme {
"https" "https";
default "http";
}
server {
...
location / {
rewrite ^([^.\?]*[^/])$ $upstream_scheme://$http_Host$1/ permanent;
}
...
}
そして、アップストリームプロキシで、次のようなX-Forwarded-Proto
ヘッダーを渡します。
location / {
proxy_set_header X-Forwarded-Proto $scheme;
...
}