0

したがって、私の Web サーバーは file_name.php のようなファイルを提供しています。file-name.php へのリクエストが透過的に file_name.php にリダイレクトされ、file_name.php へのリクエストが 301 リダイレクト経由で file-name.php に明示的にリダイレクトされるようにしたいと考えています。

すなわち。file_name.php をリクエストすると、代わりに透過的に file_name.php をロードする file-name.php に 301 リダイレクトされます。

残念ながら、これを実現するために作成した .htaccess ファイルは機能しません。ここにあります:

# make it so files with slashes that don't exist transparently redirect to files with underscores
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-]*)-([^-]*)$ $1_$2
RewriteRule ^([^-]*)-([^-]*)-([^-]*)$ $1_$2_$3

# make it so files with underscores that do exist explicitely redirect to files with slashes
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)$ /$1-$2-$3 [L,R=301]

それらは単独では機能しますが、一緒にすると無限ループになります。

何か案は?

4

2 に答える 2

1

これは実に興味深い問題でした。

私が提案しているコードは、URL 内の各byを外部的に変換する一般的な再帰ベースのコードです (アンダースコアがいくつあっても)。内部的には逆変換を行い、実際の URL をロードします。_-

# Only single underscore do an external 301 redirect
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^_]+)_([^_\s]*) [NC]
RewriteRule ^ /%1-%2 [R=301,L]

# Recursively translate each _ to - in URL and do external 302 redirect
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^_]+)_([^\s]*) [NC]
RewriteRule ^ /%1-%2 [R,L]

# Recursively translate - to _ to load actual URL internally
RewriteRule ^([^-]+)-(.*)$ /$1_$2 [L]
于 2013-08-21T19:23:13.350 に答える
1

URI が書き換えられてから書き換えエンジンにプラグインされるため、リダイレクト ループが発生します。URI ではなくリクエストと照合して、外部にリダイレクトする必要があります。また、書き換え条件は直後の書き換えルールにのみ適用されるため、ルールごとに複製する必要があります。

# make it so files with slashes that don't exist transparently redirect to files with underscores
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-]*)-([^-]*)$ $1_$2 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-]*)-([^-]*)-([^-]*)$ $1_$2_$3 [L]

# make it so files with underscores that do exist explicitely redirect to files with slashes
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^_]*)_([^_]*)_([^_\ \?]*)
RewriteRule ^ /%1-%2-%3 [L,R=301]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^_]*)_([^_\ \?]*)
RewriteRule ^ /%1-%2 [L,R=301]
于 2013-08-21T19:03:08.827 に答える