我需要从随机网址中获取最后一组数字,网址如下:
/目录/ directory2 / A-B-C-d-123
a,b,c,d等..可以是任何东西,数字,字母,但总是会有破折号
我们正在为这个项目使用kohana,所以还有一些额外的重写规则,但这是我到目前为止...
# Turn on URL rewriting
RewriteEngine On
# Installation directory
RewriteBase /site/
# Protect hidden files from being viewed
<Files .*>
Order Deny,Allow
Deny From All
</Files>
# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b - [F,L]
#My Code Attempts Here
RewriteCond %{REQUEST_URI} dealership/Listing/
RewriteRule ([0-9]*)$ index.php/dealership/Listing/$1
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]
我已经尝试了几十个配置,设置和研究Google几个小时没有具体答案。
我已经能够自己获取123,但从未将目录仍然附加,当我尝试了一些配置时,我最终会在无限循环中得到一个apache错误。
最终结果是/ directory / directory2 / 123
谢谢!
答案 0 :(得分:0)
你的规则
RewriteRule ([0-9]*)$ index.php/listing/$1
没用,因为它不会更改REQUEST_URI
,因此PHP不会看到重写的index.php/listing/123
,它会看到原始的/listing/foo-123
。如果您添加[L]
标记,它将进入循环,因为相应的ReqeuestCond
将继续为真。
通常,您会将URL位作为参数传递给脚本,例如
RewriteRule ([0-9]*)$ index.php?listing=$1 [L]
但是,在这种形式下它不起作用,因为([0-9]*)$
匹配任何路径末尾的空字符串,因此它将导致两次重写:
listing/foo-(123) → index.php?listing=123 # this is what you want ...
index.php() → index.php?listing= # ... but it gets rewritten
index.php() → index.php?listing= # no change so this is final
这是因为所有重写规则都是在每次重写后从头开始计算的(无论[L]
标志如何)。
因此,您需要一个更具体的规则
RewriteRule ^listing/[^/]*-([0-9]*)$ index.php?listing=$1 [L]
这可以单独使用,但它会与您的最终规则进行交互,因此在其上添加一个条件以防止它循环
RewriteCond $0 !^/index.php($|/) # $0 is what the RewriteRule matched
RewriteRule .* index.php/$0 [L]