0

所以我的网络服务器正在提供像 fi​​le_name.php 这样的文件。我想这样做,以便对 file-name.php 的请求透明地重定向到 file_name.php,并且对 file_name.php 的请求通过 301 重定向明确重定向到 file-name.php。

IE。您请求 file_name.php 并且您将 301 重定向到 file-name.php ,它会透明地加载 file_name.php 。

不幸的是,我为完成此操作而编写的 .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

因为 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 回答
1

这真是一个有趣的问题。

我建议的代码是一个通用的基于递归的代码,它将在 URL 外部翻译每个代码_-无论有多少下划线)。在内部,它会进行反向翻译并加载实际的 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 回答