Apache Rewrite - 奇怪的行为

时间:2016-01-30 01:51:41

标签: php apache .htaccess mod-rewrite url-rewriting

以下是我的htaccess规则:

# Cosmetics: Remove WWW Subdomain
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%2://%1%{REQUEST_URI} [R=301,L]

# Cosmetics: Remove Trailing Slashes
RewriteCond %{THE_REQUEST} //
RewriteRule .* $0 [R=301,L]

# Cosmetics: Remove PHP Extension
RewriteCond %{ENV:REDIRECT_STATUS} !(?:^4|^5) # Avoid problems with error.php!
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ .*\.php
RewriteRule ^(.*)\.php /$1/ [R=301,L]

# Cosmetics: Remove Index
RewriteRule ^(.*)index/$ /$1 [R=301,L]

# Cosmetics: Force Trailing Slash
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [R=301,L]

# Functions: Dynamic Versioning
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.[0-9]+\.(bmp|css|cur|gif|ico|jp(?:eg?|g)|js|png|svgz?|tiff?|webp)$ $1.$2 [L]

# Functions: Pretty URLs
RewriteRule ^books/([a-z]+)/$ /books.php?mode=$1 [L]
RewriteRule ^error/([^/]+)/$ /error.php?code=$1 [L]

# Functions: Resources Lookup
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} ^/.*/$
RewriteRule ^(.*)/$ $1\.php [L]

他们正在产生一个我无法摆脱的奇怪问题。如果我转到以下网址:

http://127.0.0.1/books/test12345/

未应用以下规则:

RewriteRule ^books/([a-z]+)/$ /books.php?mode=$1 [L]

因为URI的最后部分也包含数字。因此htaccess尝试执行下一个规则:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} ^/.*/$
RewriteRule ^(.*)/$ $1\.php [L]

我被重定向到:

http://127.0.0.1/books/test12345.php/

然后服务器返回错误500,因为我产生了太多重定向,当然。现在......这是我查看日志时看到的内容:

strip per-dir prefix: C:/website/books/test12345/ -> books/test12345/
applying pattern '^books/([a-z]+)/$' to uri 'books/test12345/'
add path info postfix: C:/website/books -> C:/website/books/test12345/

strip per-dir prefix: C:/website/books/test12345/ -> books/test12345/
applying pattern '^error/([^/]+)/$' to uri 'books/test12345/'
add path info postfix: C:/website/books -> C:/website/books/test12345/

strip per-dir prefix: C:/website/books/test12345/ -> books/test12345/
applying pattern '^(.*)/$' to uri 'books/test12345/'
RewriteCond: input='C:/website/books' pattern='!-d' => matched
RewriteCond: input='C:/website/books.php' pattern='-f' => matched
RewriteCond: input='/books/test12345/' pattern='^/.*/$' => matched
rewrite 'books/test12345/' -> 'books/test12345.php'

add per-dir prefix: books/test12345.php -> C:/website/books/test12345.php
trying to replace prefix C:/website/ with /
strip matching prefix: C:/website/books/test12345.php -> books/test12345.php
add subst prefix: books/test12345.php -> /books/test12345.php

internal redirect with /books/test12345.php [INTERNAL REDIRECT]

为什么%{REQUEST_FILENAME}.php成为C:/website/books.php而不是C:/website/books/test12345.php

0 个答案:

没有答案