2009-10-10 40 views
10

Tôi đang cố gắng tạo quy tắc được sử dụng trong tệp .htaccess để khớp với mọi thứ trừ một chuỗi cụ thể, trong trường hợp này là index..htaccess ghi lại regex: khớp mọi thứ nhưng "chỉ mục"

Tôi nghĩ rằng có thể phù hợp với chuỗi đặc biệt này trước tiên và sử dụng [L] nhưng không hoạt động,
và có thể sử dụng regex sau, nhưng nó gây ra lỗi 500.

Tôi muốn để phù hợp với:

  • pagename1
  • pagename2/bất cứ điều gì
  • pagename3/234/bất cứ điều gì
  • về
  • xúc-us
  • (vv)

nhưng n ot

  • index/123
  • index/124/bất cứ điều gì

(BTW "chỉ số" là tên của một tập tin không có phần mở rộng, không phải lựa chọn của tôi, đây là một điều làm việc)

^(?!index)[\w/\-]+ 

Tôi giả định rằng việc thực thi apex của apache không tuân theo quy tắc (?!xxx).

Bất kỳ trợ giúp/đề xuất nào sẽ được đánh giá cao.

Trả lời

15

Bạn có thể sử dụng RewriteCond s để làm điều này, ví dụ:

RewriteCond %{REQUEST_URI} !^index 
RewriteRule (.*) index.php?what=$1 

Điều đó sẽ viết lại mỗi URL mà không bắt đầu bằng việc chỉ số . Nếu bạn muốn nó tránh nó ở bất kỳ nơi nào trong URL, hãy xóa ^

+0

Tôi chỉ có thể làm việc này bằng cách sử dụng "! Index" thay vì "!^Index". (Và có, "chỉ số" là một sự khởi đầu của chuỗi yêu cầu, như trong câu hỏi của jezmck ở trên). Bất kỳ suy nghĩ nào về lý do tại sao điều này có thể xảy ra? – rinogo

+1

Giải quyết nó. Ngay cả khi bạn đang làm việc trong thư mục con, sử dụng "RewriteCond% {REQUEST_URI}" sử dụng toàn bộ URI yêu cầu, vì vậy bạn phải đưa đường dẫn www vào thư mục hiện tại. Trong trường hợp của tôi, điều này có nghĩa là tôi đã sử dụng: "RewriteCond% {REQUEST_URI}! ^/R/index $" (tệp .htaccess mà tôi đang làm trong thư mục 'r'). – rinogo

3

(Xin đọc những ý kiến ​​tôi nghi ngờ nó và tôi chưa bao giờ gặp phải vấn đề, trong khi nó mang lại cho một sạch hơn nhiều .htaccess file, nhưng:. Sử dụng RewriteCondsức mạnh được ưa thích hơn sử dụng RewriteRule với một dấu gạch ngang, do cách rulesets are processed ?)

Chỉ cần sử dụng RewriteRule như sau, để không viết lại (dấu gạch ngang), và dừng lại viết lại sau ([L]) cho bất cứ điều gì mà bắt đầu với index/:

# Do not rewrite anything that starts with index/ 
RewriteRule ^index/ - [L]

Sau này, làm bất kỳ viết lại bạn thích.

Hoặc thậm chí có thể hạn chế một số đầu tiên hơn:

# Do not rewrite files, directories or symbolic links 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule . - [L]
+0

Ah, đó cũng có thể là câu trả lời tôi đang tìm kiếm, tôi không biết về '-' trong .htaccess – jezmck

+1

Các điều kiện an toàn hơn. Nếu bạn có một chỉ số phù hợp với quy tắc sau này thì mọi thứ có thể trở nên kỳ lạ. [L] không phải là vượt qua cuối cùng bao giờ hết, chỉ cần chấm dứt vượt qua hiện tại, có những trường hợp khác nhau mà yêu cầu vượt qua nhiều lần thông qua các quy tắc. –

+0

@Vinko, nhiều lần vượt qua rất tốt để ghi nhớ thực sự. Nhưng làm thế nào một RewriteCond (đặc biệt là một RewriteCond tiêu cực) không phải là đối tượng với các trận đấu kỳ lạ trong một pass sau đó? – Arjan

1

Apache đã sử dụng ba cách triển khai biểu thức chính quy khác nhau. Đầu tiên là System V8, kể từ Apache 1.3, họ sử dụng POSIX ERE và vì Apache 2 họ sử dụng PCRE.Và chỉ PCRE mới hỗ trợ các xác nhận phía trước. Vì vậy, bạn cần Apache 2 để sử dụng quy tắc đó.

Nhưng bây giờ cho câu hỏi của bạn. Nếu bạn sử dụng quy tắc này:

RewriteRule ^index/ - [L] 

mọi thứ bắt đầu bằng /index/ phải được nắm bắt theo quy tắc này và không nên áp dụng quy tắc nào khác.

Nhưng nếu điều đó không làm việc, hãy thử này:

RewriteRule !^index/ … 

Một lần nữa, quy định này sẽ được áp dụng trên bất kỳ yêu cầu đó là đường dẫn URL không bắt đầu bằng /index/.

Và nếu bạn muốn chụp bất cứ thứ gì từ URL, sử dụng một điều kiện RewriteCond để kiểm tra một trong hai đường dẫn đầy đủ URL thân (%{REQUEST_URI}) hay chỉ là trận đấu của một trong những nhóm mẫu của bạn:

RewriteCond %{REQUEST_URI} !^/index/ 
RewriteRule (.*) … 
# or 
RewriteCond $1 !^index$ 
RewriteRule ^([^/]+)/(.*) … 
Các vấn đề liên quan